JS中的异步操作

206 阅读2分钟

Promise

定义:

在MDN中对Promise的定义是,用于表示一个异步操作的最终完成 (或失败), 及其结果值。

三种状态:

  • pending(进行中):初始状态
  • resolved(已完成):操作成功,也叫作fulfilled
  • rejected(已失败): 操作失败

缺点:

  • 一旦创建无法中途取消
  • 处于pending状态时,无法获取当前的执行进度
  • 如果没有设置回调函数,内部的报的错误无法反应到外部

创建Promise:

  • 构造函数创建
const testPromise = new Promise(function(resolve, reject) {
    setTimeout(() => {
        resolve("操作成功")
    })
})
testPromise.then((response) => {
    console.log(response) // 打印操作成功
}, () => { // 失败回调
    
})
  • Promise.resolve()和Promise.reject()
    这两个方法可以将一个对象直接转换成Promise对象
const testPromise = Promise.resolve('hello Promise')
testPromise.then(response => {
    console.log(response) // 打印 hello Promise
})

上述方法生产一个新的Promise对象,该对象的状态是resolved,所以它会立刻执行回调函数。同理Promise.reject()方法创建出来的对象状态是rejected,会立刻实行onRejected的回调

  • Promise.all()
    该方法用于将多个Promise对象封装成一个新的Promise实例
const testPromise = Promise.all([p1,p2,p3])

在上述方法中,Promise.all接受一个数组作为参数且数据中的成员都是promises实例(p1,p2,p3都是Promise实例)。testPromise状态由p1、p2、p3共同决定,主要有一下两种情况:
1、只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
2、只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race与Promise.all的却别是,只要p1、p2、p3之中有一个实例先改变状态,p的状态就跟着改变,那个先改变的Promise实例的返回值,就传递给p的返回值。

参考链接

JavaScript Promise 对象