Promise是什么?

这篇具有很好参考价值的文章主要介绍了Promise是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Promise对象的特点

Promise.resolve()

Promise.reject()

Promise.try()

Promise.all()

Promise.race()

Promise.allSettled()

Promise.any()

区分:


Promise是异步编程的一种解决方案,它就是一个容器,里面保存着某个未来才会结束的事件的结果,从语法上说,Promise就是一个对象,从他可以获取异步操作的消息。

Promise对象的特点

  1. 对象的状态不受外界的影响:Promise对象代表一个异步操作,有三种状态:pending、fullfilled、rejected,只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态

  2. 一旦改变,就不会再变,任何时候都可以得到这个结果

Promise.resolve()

将现有对象转为Promise对象。   

Promise.resolve('foo')
//等价于
new Promise(resolve=>resolve('foo'))

  参数:

  1. 是一个Promise实例

    如果参数是Promise实例,那么Promise.resolve将不做任何修改,原封不动地返回这个实例。
  2. 是一个thenable对象

    thenable对象指的是具有then方法的对象,如:
let thenable={
    then:function(resolve,reject){
        resolve(42)
    }
}

         Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thneable对象的then方法

     3.不是具有then方法的对象,或根本就不是对象

        Promise.resolve方法返回一个新的Promise对象,状态为resolved。

const p=Promise.resolve('hello')
p.then((s)=>{
    console.log(s)
})

     4.不带有任何参数

        Promise.resolve()方法允许调用时不带参数,直接返回一个resolved状态的Promise对象。

        如果希望得到一个Promise对象,比较方便的方法就是直接调用Promise.resolve()方法,如下:

const p=Promise.resolve();
p.then(()=>{
	//...
})

         立即resolve()的Promise对象,是在本轮“事件循环”(event loop)的结束时执行,而不是在下一轮“事件循环”的开始时。

setTimeout(function () {
  console.log('three');
}, 0);
Promise.resolve().then(function () {
  console.log('two');
});
console.log('one');
// one
// two
// three

js的执行顺序:先同步再异步。

异步中任务队列的执行顺序:先微任务队列,再宏任务队列。

Promise中的resolve、reject属于微任务队列,settimeout属于宏任务队列。

Promise.reject()

Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态是rejected

const p=Promise.reject('出错了')
//等价于
const p=new Promise((resolve,reject)=>{
	reject("出错了")
})
p.then(null,(s)=>{
	console.log(s)//出错了
})

 Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。

const thenable={
    then(resolve,reject){
        reject("出错了")
    }
}

Promise.reject(thenable)
.catch(e=>{
	console.log(e===thenable)//true
})

Promise.try()

让同步函数同步执行,异步函数异步执行,并让它们具有统一的·API

有两种写法:

  1. async函数

const f=()=>console.log('now')
(async()=>f())()//同步函数写法
(async()=>f())().then(...)//异步函数写法
console.log('next')

//now
//next

     2.new Promise()

const f=()=>console.log('now')
(
	()=>new Promise(resolve=>resolve(f()))
)()
cosole.log('next')
//now
//next
  • 上面代码使用的是立即执行的匿名函数,执行new Promise(),这种情况下,同步函数也是同步执行的。

  • 还可以用Promise.try方法代替上面的写法:

const f=()=>console.log('now')
Promise.try(f)
console.log('next')
//now
//next
  • 还可以统一用peomise.catch()捕获所有同步和异步的错误:

Promise.try(() => database.users.get({id: userId}))
  .then(...)
  .catch(...)

Promise.all()

Promise.all()方法用于将多个Promise实例,包装成一个新的Promise实例。

const p=Promise.all([p1,p2,p3])
  • Promise.all()的参数可以不是数组,但必须有Iterator接口,且返回的每个成员都是Pomise实例

  • p的状态由p1、p2、p3决定,分成两种情况

    1. 只有p1、p2、p3的状态都变成fullfilled,p的状态才会变成fullfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数

    2. 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

const databasePromise = connectDatabase();
const booksPromise = databasePromise
  .then(findAllBooks);
const userPromise = databasePromise
  .then(getCurrentUser);
Promise.all([
  booksPromise,
  userPromise
])
.then(([books, user]) => pickTopRecommendations(books, user));

注意:如果参数中有Promise实例并且自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法.

Promise.race()

Promise.race()方法同样是将多个Promise实例,包装成一个新的Promise实例

const p=Promise.race([p1,p2,p3])

        上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变,率先改变的Promise实例的返回值传递给p的回调函数。

        Promise.all()方法的参数与Promise.all()方法的一样,如果不是Promise实例,就会先调用Promise.resolve方法,将参数转为Promise实例。

const p = Promise.race([
  fetch('/resource-that-may-take-a-while'),
  new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('request timeout')), 5000)
  })
]);
p
.then(console.log)
.catch(console.error);

        上面代码中race有两个参数:fetch('/resource-that-may-take-a-while')和new Promise(function (resolve, reject) { setTimeout(() => reject(new Error('request timeout')), 5000) }),如果在5秒之内第一个函数没有返回结果,就会因为执行第二个函数,导致Promise的状态变为reject。

Promise.allSettled()

Promise.allSettled()方法接受一组Promise实例作为参数,包装成一个新的Promise实例,只有等到所有这些参数实例都返回结果,不管是fullfilled还是rejected,包装实例才会结束。当我们不关心异步操作的结果,只关心这些操作有没有结束,这时,Promise.allSettled()方法就派上用场了。

Promise.any()

Promise.any()方法接收一组Promise实例作为参数,包装成一个新的Promise实例,只要有一个参数实例变成fullfilled状态,包装实例就会变成fullfilled状态,如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态,Promise的状态总是fullfilled。

区分易混淆:

在这里我们区分一下Promise.all()、Promise.race()、Promise.allSettled()、Promise.any():

  • Promise.all():参数实例状态都变成fullfilled,Promise的状态才会变成fullfilled,只要有一个变成rejected,Promise的状态就会变成rejected。

  • Promise.race():参数实例率先改变状态的,Promise的状态会跟着改变。

  • Promise.allSettled():当参数实例发出的请求结束时,不管其是fullfilled还是rejected,Promise的状态总是fullfilled

  • Promise.any():只要有一个参数实例变成fullfilled,Promise状态就会变成fullfilled,如果所有参数实例状态都变成rejected状态,Promise状态就会变成rejected

文档:ES6 入门教程文章来源地址https://www.toymoban.com/news/detail-448381.html

到了这里,关于Promise是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 前端多线程处理 —— Promise对象

    在前端编程中,处理一些简短、快速的操作,在主线程中就可以完成。 但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要异步编程来实现,以避免只用主线程时造成页面一时无法响应的事情。 以发送网络请求为例,在

    2024年02月08日
    浏览(48)
  • 【ES6知识】Promise 对象

    【ES6知识】Promise 对象

    1.1 概述 Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。是异步编程的一种解决方案(可以解决回调地狱问题)。 一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。它让你能够把异步操作最终的成功返回值或者失败原因和相应的

    2024年02月07日
    浏览(16)
  • JS中Promise对象及其使用方式

    JS中Promise对象及其使用方式

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月09日
    浏览(10)
  • 【web渗透思路】框架敏感信息泄露(特点、目录、配置)

    【web渗透思路】框架敏感信息泄露(特点、目录、配置)

      博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。 擅长:对

    2023年04月19日
    浏览(11)
  • JS遍历对象的方法及特点

    JS遍历对象的方法及特点

    1、定义一个对象 控制台输出的obj中,原型Object上添加了height和major 2、使用 for…in 循环遍历对象的属性 for…in遍历属性时,包含该实例对象的 自有属性 和该实例对象上的 原型属性 ,不包含不可枚举的属性 控制台输出结果: 根据输出结果可知for……in 遍历对象会遍历实例对

    2024年01月19日
    浏览(8)
  • 什么是promise?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 promise是es6新增的API,用于异步任务的封装 promise用法1:封装ajax请求,在ajax回调函数之外使用请求数据 *因为异步函数任务没有

    2023年04月12日
    浏览(6)
  • Promise是什么?

    目录 Promise对象的特点 Promise.resolve() Promise.reject() Promise.try() Promise.all() Promise.race() Promise.allSettled() Promise.any() 区分: Promise是异步编程的一种解决方案,它就是一个容器,里面保存着某个未来才会结束的事件的结果,从语法上说,Promise就是一个对象,从他可以获取异步操作的

    2024年02月05日
    浏览(5)
  • [JavaScript理论学习] 什么是Promise (含如何判断一个值是Promise)

    本文旨在对 Promise 的规范进行解释, 便于读者在学习 Promise 的过程中梳理 Promise 之间的操作关系, 不对具体的代码实现和Promise用法进行解释. 比如, 为什么 [MDN-await] 中要提及一个 thenable 对象, 而且这个 thenable 对象 还可以和 Promise 实例 一样使用 await 等待处理, 这就涉及到了下面

    2024年02月09日
    浏览(14)
  • java八股文面试[java基础]——面相对象特点

    java八股文面试[java基础]——面相对象特点

    三大特点: 封装 继承 多态   面试题:java如何实现多继承(除了使用接口之外) 实现多继承有三个方法 : 多层继承 内部类 接口 参考 java实现多继承的三种方式 多层继承 ​如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承

    2024年02月12日
    浏览(16)
  • ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代

    ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代

    // kerwin {age:100,location: ‘dalian’} 其中…other 可以拿到对象的剩余参数 // {name: ‘xiaoming’,location: ‘dalian’,age: 18] 在实际开发中,我们会使用ajax() 封装一些默认的属性和属性值,以备用户忘记或未传入某些参数。 // { methods: “get”, async: true, url: “/api”} 正则表达式命名捕获

    2024年04月09日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包