Promise的构造函数中如果执行同步代码,调用resolve时会立马更新状态吗

发布于 2022-09-12 13:19:43 字数 551 浏览 10 评论 0

Promise的构造函数中如果执行同步代码,调用resolve时会立马更新状态吗,我的理解是resolve是一个微任务,会变更状态,执行then注册的回调,所以在下面的代码中,promise1应该是pending状态,此时调用栈还在执行本轮宏任务,尚未执行微任务,但是在Chrome中,控制台输出的promise1已经是fulfilled。
代码如下:

const promise1 = new Promise((resolve, reject) => {
  console.log('promise1');
  resolve('resolve1');
})

const promise2 = promise1.then((res) => {
  console.log(res);
});

console.log('1', promise1);
console.log('2', promise2);

Chrome中结果如下:
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱已欠费 2022-09-19 13:19:43

更新状态不意味就立马要去执行回调。状态是在微任务期间判断是否执行该回调的依据

坏尐絯 2022-09-19 13:19:43

变更状态这个操作是同步执行的。传入promise的executor是同步执行,可以调用它的入参resolve或者reject函数改变状态。所以也是同步调用。而resolve和reject本身的执行也是同步的。

下面是简单的不包含then的promise实现

function NewPromise(executor) {
  this.state = PENDING
  this.value = undefined
  this.reason = undefined
  this.successQueue = []
  this.failureQueue = []
  
  // resolve和reject是同步执行的
  const resolve = val => {
    if (this.state !== PENDING) {
      return
    }
    this.state = FULFILLED
    this.value = val
    this.successQueue.forEach(cb => cb(this.value))
  }
  const reject = reason => {
    if (this.state !== PENDING) {
      return
    }
    this.state = REJECTED
    this.reason = reason
    this.failureQueue.forEach(cb => cb(this.reason))
  }
  
  try {
    // 同步执行executor
    executor(resolve, reject)
  } catch (e) {
    reject(e)
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文