promise

515 阅读2分钟

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 接受一个数组作为参数,p1p2p3 都是 Promise 实例,如果不是,就会先调用 Promise.resolve 方法,将参数转为 Promise 实例,再进行处理。Promise.all 的参数可以不是数组,但必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。

p 的状态由 p1p2p3 决定。

(1)只有 p1p2p3 的状态都变成 fulfilledp 的状态才变成 fulfill,此时,p1p2p3 的返回值组成一个数组,传递给 p 的回调函数。

(2)只要 p1p2p3 中有一个被 rejectedp 的状态就变成 rejected,此时,第一个被 rejected 的实例的返回值,传递给 p 的回调函数。

4. Promise.race

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

let p = Promise.all([p1, p2, p3])

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

Promise.race 的参数如果不是 Promise 实例,就会先调用 Promise.resolve 方法,将参数转为 Promise 实例,再进行处理。