我有以下代码:
const doWorkPromise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('#2 (async call)');
}, 0);
resolve('#3 (async call?)');
console.log('#1 (sync call)');
});
doWorkPromise.then((result) => {
console.log('Success!', result);
}).catch((error) => {
console.log('Error!', error);
});产出如下:
#1 (同步呼叫)
成功!#3 (异步调用?)
#2 (异步调用)
我知道同步代码位于调用堆栈上,异步代码在Node上注册事件-回调对,其中回调被移动到事件后的回调队列中。只有在调用堆栈为空时,事件循环才会从回调队列中提取元素。因此,我希望先执行同步代码,然后按顺序执行异步代码,因为超时为0,如下所示:
#1 (同步呼叫)
#2 (异步调用)
成功!#3 (异步调用?)
有人能解释一下为什么在‘2(异步调用)’之前执行resolve吗?
发布于 2020-12-10 21:04:13
reject从未被执行过。
resolved在#2之前执行,因为:
setTimeout将一个函数放在超时queueresolve解析promiseconsole.log日志#1doWorkPromise.then指定一个函数在承诺解决setTimeout的函数的最小超时时间被调用,日志#2发布于 2020-12-10 21:04:37
您的代码同步执行以下内容
resolve('#3 (async call?)');承诺的...so立即处于已解决的状态。事实上,你已经启动了计时器,因为这与承诺没有关系.这是无关的。
因此,对该承诺的then回调将在作业队列的下一个处理过程中触发,因此在主同步代码执行完成后,您将看到“成功”。
稍后(是的,甚至setTimeout(..., 0)也会引入一个小延迟),计时器将过期,但该事件与无关,与任何承诺无关。
共同模式
当您用new Promise创建一个承诺并希望它稍后解决时,您确实可以使用setTimeout,但是只有在该定时器过期时才调用resolve。否则,定时器不会做任何符合承诺的事情:
setTimeout(() => {
resolve();
}, 0);https://stackoverflow.com/questions/65242098
复制相似问题