131

据我了解,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

4

3 回答 3

184

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

如果你想resolve()退出你的初始化函数,你必须在它前面加上return

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});
于 2015-03-06T09:57:53.517 回答
27

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

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

只有当 JS 事件循环被交还控制权时,回调才能从队列中移除并实际调用。

于 2015-03-06T09:57:50.407 回答
1

功能一点resolve()也不像。return它只是表示在then()方法中注册的回调函数的参数现在已准备就绪,并且回调函数可能会离开作业队列(或微任务队列)并进入主 JS 调用堆栈,但这仅在所有同步代码和在此运行完成之前进入队列的异步代码。console.log("Not doing more stuff after a return statement");您代码中的这条语句是同步代码,它优先于异步代码。这就是为什么它首先运行

于 2021-03-26T11:52:18.010 回答