Promise执行器中resolve/reject:立即置定状态还是执行器返回后?
Promise执行细节问题解答
先看你提供的代码:
function asyncDog(ball) { return new Promise((resolve) => { console.log("Promise() constructor --> executor function \n setting timeout..."); setTimeout(() => { console.log("resolving..."); resolve(ball) console.log("resolved!") }, 2000) console.log("Promise() constructor --> executor function \n timeout set!"); }) } var promise = asyncDog("ball1") promise.then((value) => { console.log(value); }) console.log("async function call done")
针对你的三个疑问,逐一解答:
1. 为什么"resolved!"在"ball1"之前输出?
这是因为Promise的then回调属于微任务,而setTimeout的回调是宏任务。当setTimeout的回调执行时:
- 先同步执行
console.log("resolving...") - 调用
resolve(ball)后,会把then里的回调加入到微任务队列,但不会立刻执行 - 接着同步执行
console.log("resolved!"),这部分是当前宏任务里的同步代码,优先完成 - 等当前宏任务(
setTimeout的回调)执行完毕后,才会去处理微任务队列里的then回调,此时才会输出"ball1"
2. resolve()函数是否仅在执行器返回后才生效?
不是。resolve()是同步执行的函数,调用它的瞬间就会把Promise的状态从pending改为fulfilled,完全不需要等执行器函数执行完毕。执行器函数本身是同步运行的,在执行器内部的代码会按顺序执行,resolve的作用是即时改变状态,和执行器是否返回无关。
3. 调用resolve()后、执行器中下一个console.log()执行前,Promise是已置定状态还是仍处于pending状态?
调用resolve()的那一刻,Promise就已经变成fulfilled状态了,哪怕后面的console.log("resolved!")还没执行。resolve的核心逻辑就是同步更新Promise的状态,这个操作是即时完成的,不会等待后续的同步代码。你可以理解为:resolve执行后,Promise的状态立刻固定,后续代码不影响这个状态。
内容的提问来源于stack exchange,提问作者hymced
相关产品推荐
相关产品推荐

