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

据我所知,承诺是可以解析()或拒绝()的东西,但我惊讶地发现承诺中的代码在调用解析或拒绝后继续执行。

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

有人可以解释为什么以下示例有时会在解析调用后显示控制台.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");
});

吉斯宾


答案 1

JavaScript具有“运行到完成”的概念。除非引发错误,否则将执行函数,直到到达语句或其末尾。函数外部的其他代码不能干扰它(除非再次引发错误)。return

如果要退出初始值设定项函数,则必须在前面加上 :resolve()return

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

答案 2

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

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

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