为什么 javascript ES6承诺在解决后继续执行?

正如我所理解的,承诺是可以解决()或拒绝()的,但是我惊讶地发现,在调用了解决或拒绝之后,承诺中的代码将继续执行。

我认为退出或返回的解决或拒绝是一个异步友好的版本,它将停止所有立即执行的函数。

有人能解释一下为什么下面的例子有时在解决调用之后显示 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

42530 次浏览

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

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

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

JavaScript 有 “运行到完成”的概念。除非抛出错误,否则将执行函数,直到到达 return语句或其结束为止。函数之外的其他代码不能干扰它(除非再次抛出错误)。

如果你想要 resolve()退出你的初始化函数,你必须通过 return预先设置它:

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

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