首页 > 解决方案 > 当我在 Promise 上调用 Promise.resolve() 时会发生什么(从事件循环的角度来看)?

问题描述

这是简化的代码结构:

new Promise(resolve => {
    resolve(new Promise(resolve => resolve(1)))
}).then(() => {
    console.log('tick 3')
}).then(() => {
    console.log('tick 4')
})

new Promise(resolve => resolve(1)).then(() => {
    console.log('tick 1')
}).then(() => {
    console.log('tick 2')
})

控制台日志:

tick 1
tick 2
tick 3
tick 4

我的问题是,为什么记录的回调函数tick 3执行 2 个“tick”(或事件循环,不确定如何正确描述)比记录的回调晚tick 1而不是仅 1 个“tick”?如果函数只比函数tick 3晚执行 1 个“tick” ,则应该比它更早进入任务队列更早记录。tick 1tick 3tick 2

我尝试像这样在 MDN 上查找文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve ,但只发现这句话与我的问题有关,其中显然在这里没有帮助:

Promise.resolve()方法返回一个用给定值解析的 Promise 对象。如果该值是一个承诺,则返回该承诺。

那么当 Promise.resolve() 收到一个 Promise 时,到底发生了什么?提前致谢。

标签: javascriptpromise

解决方案


这样想:

Promise.resolve = (value) => {
   if (value instanceof Promise) return value;
   
   return new Promise(resolve => resolve(value));
}

如果你向它传递一个承诺,它只会返回承诺。如果你传递一个非承诺,它会将它包装在一个用该值解析的承诺中。


推荐阅读