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

时间:2015-03-06 09:55:48

标签: javascript promise ecmascript-6 es6-promise

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

我考虑过解决或拒绝作为退出或返回的异步友好版本,这将暂停所有立即执行功能。

有人可以解释为什么以下示例有时会在解析调用后显示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

3 个答案:

答案 0 :(得分:103)

JavaScript具有"run to completion"的概念。除非抛出错误,否则将执行函数,直到达到return语句或其结束。函数之外的其他代码不会干扰它(除非再次抛出错误)。

如果您希望resolve()退出初始化函数,则必须在return之前添加:

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

答案 1 :(得分:17)

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

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

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

答案 2 :(得分:0)

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