为什么javascript ES6 Promises在解析后继续执行

Why does javascript ES6 Promises continue execution after a resolve?

本文关键字:继续 执行 javascript ES6 Promises 为什么      更新时间:2023-09-26

我知道promise是可以resolve()或reject()的东西,但我惊讶地发现,promise中的代码在调用resolve或reject后仍在继续执行。

我认为resolve或reject是exit或return的异步友好版本,它将停止所有立即执行的函数。

有人能解释一下为什么下面的例子有时会在解析调用后显示console.log背后的想法吗:

var call = function() {
    return new Promise(function(resolve, reject) {
        resolve();
        console.log("Doing more stuff, should not be visible after a resolve!");
    });
};
call().then(function() {
    console.log("resolved");
});

jsbin

JavaScript具有"运行到完成";。除非抛出错误,否则将执行函数,直到到达return语句或其末尾。函数之外的其他代码不能干扰它(除非再次抛出错误)。

如果你想让resolve()退出初始化器函数,你必须用return:把它前置

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});

规范仍然要求异步调用resolve承诺时将调用的回调。这是为了确保在混合使用同步和异步操作的promise时行为一致。

因此,当您调用resolve时,回调被排队,并且函数执行将立即继续,resolve()调用之后的任何代码都将执行。

只有在JS事件循环被赋予控制权后,回调才能从队列中删除并实际调用。

resolve()函数与return完全不同。它只是表明,用then()方法注册的回调函数的参数现在已经准备好了,回调函数可能会离开Job队列(或Micro任务队列),进入主JS调用堆栈,但只有当所有同步代码和在此之前进入队列的异步代码都完成运行时,才会发生这种情况。console.log("Not doing more stuff after a return statement");代码中的这个语句是一个同步代码,它比异步代码具有优先级。这就是它运行第一个的原因