Promise 是异步编程的一种解决方法,Promise
对象用于表示一个异步操作的最终完成(或失败)及其结果值。Promise
解决了之前处理异步任务时,代码不够规范;容易出现回调地狱,使得代码难以读懂;很难进行错误处理的问题。
1. 创建promise
下面代码创造了一个 Promise
实例。
const promise = new Promise((resolve, reject)=>{
if(/*异步操作成功*/){
resolve(value)
}else{
reject(error)
}
})
resolve
函数的作用是,将 Promise
对象的状态从“未完成”变为“成功”,在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
reject
函数的作用是,将 Promise
对象的状态从“未完成”变为“失败”,在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。
2. Promise.prototype.then
Promise 实例具有then
方法,它的第一个参数是 resolved
状态的回调函数,第二个参数是rejected
状态的回调函数。
then
方法会返回一个新的 Promise 实例,因此可以采用链式写法,在 then
方法后面再调用另一个 then
方法。
3. Promise.all
Promise.all() 方法用于将多个 promise 实例,包装成一个新的 promise 实例
let p = Promise.all([p1, p2, p3])
Promise.all 接受一个数组作为参数,p1
, p2
,p3
都是 Promise 实例,如果不是,就会先调用 Promise.resolve
方法,将参数转为 Promise 实例,再进行处理。Promise.all 的参数可以不是数组,但必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。
p
的状态由 p1
, p2
,p3
决定。
(1)只有 p1
, p2
,p3
的状态都变成 fulfilled
,p
的状态才变成 fulfill
,此时,p1
, p2
,p3
的返回值组成一个数组,传递给 p
的回调函数。
(2)只要 p1
, p2
,p3
中有一个被 rejected
,p
的状态就变成 rejected
,此时,第一个被 rejected
的实例的返回值,传递给 p
的回调函数。
4. Promise.race
Promise.race() 方法同样用于将多个 promise 实例,包装成一个新的 promise 实例。
let p = Promise.all([p1, p2, p3])
上面代码中,只要 p1
, p2
,p3
中有一个实例率先改变状态,p
的状态就跟着改变,那个改变的实例的返回值,就传递给 p
的回调函数。
Promise.race
的参数如果不是 Promise 实例,就会先调用 Promise.resolve
方法,将参数转为 Promise 实例,再进行处理。