首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >承诺:为什么在同步代码之后和异步代码之前执行解决方案?

承诺:为什么在同步代码之后和异步代码之前执行解决方案?
EN

Stack Overflow用户
提问于 2020-12-10 20:48:38
回答 2查看 147关注 0票数 0

我有以下代码:

代码语言:javascript
运行
复制
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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-10 21:04:13

reject从未被执行过。

resolved在#2之前执行,因为:

  1. setTimeout将一个函数放在超时queue
  2. resolve解析promise
  3. console.log日志#1
  4. 函数finished
  5. doWorkPromise.then指定一个函数在承诺解决
  6. 时运行,承诺已经被解析,所以函数是executed
  7. After,传递给setTimeout的函数的最小超时时间被调用,日志#2
票数 0
EN

Stack Overflow用户

发布于 2020-12-10 21:04:37

您的代码同步执行以下内容

代码语言:javascript
运行
复制
resolve('#3 (async call?)');

承诺的...so立即处于已解决的状态。事实上,你已经启动了计时器,因为这与承诺没有关系.这是无关的。

因此,对该承诺的then回调将在作业队列的下一个处理过程中触发,因此在主同步代码执行完成后,您将看到“成功”。

稍后(是的,甚至setTimeout(..., 0)也会引入一个小延迟),计时器将过期,但该事件与无关,与任何承诺无关。

共同模式

当您用new Promise创建一个承诺并希望它稍后解决时,您确实可以使用setTimeout,但是只有在该定时器过期时才调用resolve。否则,定时器不会做任何符合承诺的事情:

代码语言:javascript
运行
复制
setTimeout(() => {
    resolve();
}, 0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65242098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档