关于Promise那些事系列(3)

254 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

接着说Promise~ 在这里插入图片描述

resolverejeict

如果调用resolve函数和reject函数带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出错误;resolve函数的参数除了正常的值以外,还可能是另一个Promise对象的实例。

比如下面的这段代码:

const p1 = new Promise(function (resolve, reject) {
  // ...这里是代码
});

const p2 = new Promise(function (resolve, reject) {
  // ...这里是代码
  resolve(p1);
})

这段代码中,p1p2都是Promise的实例,但是p2resolve方法将p1作为参数,即一个异步操作的结果是返回另一个异步操作。

注意,这时的p1的状态就会传递给p2,也就是说,p2的状态是由p1决定的。加入p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是resolved或者rejected,那么p2就会立即执行。

    const p1 = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject(new Error("失败"))
      }, 3000)
    })
    const p2 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(p1)
      }, 1000)
    })

    p2
      .then(resp => console.log(resp))
      .catch(error => console.log(error))

      //输出Error: 失败(第108行)

这段代码中,p1是一个 Promise对象,3 秒之后状态变为rejectedp2的状态在 1 秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2自己的状态。所以,后面的then语句都变成针对后者(p1)。又过了 2 秒,p1变为rejected状态,导致触发catch方法指定的回调函数。 注意,调用resolvereject并不会终结 Promise 的参数函数的执行。

new Promise((resolve, reject) => {
  resolve("resolve");
  console.log("console");
}).then(r => {
  console.log(r);
});
// console
// resolve

这段代码中,调用resolve("resolve")以后,后面的console.log("console")还是会执行,并且会首先打印出来。这是因为立即resolved Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。

下一篇博客继续输出Promise系列的then方法。期待一下~