为什么 javascript ES6 Promises 在 resolve 之后继续执行?

Why does javascript ES6 Promises continue execution after a resolve?

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

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

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

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

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

只有在 JS 事件循环重新获得控制权后,回调才能从队列中移除并实际调用。

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");
});

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