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

问题描述 投票:0回答:4

据我所知,promise 是可以解析()或拒绝()的东西,但我惊讶地发现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

javascript promise ecmascript-6 es6-promise
4个回答
219
投票

JavaScript 具有“运行至完成” 的概念。除非抛出错误,否则函数将一直执行到

return
语句或其末尾。函数之外的其他代码不能干扰它(除非再次抛出错误)。

如果您希望

resolve()
退出初始化函数,则必须在其前面添加
return
:

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

37
投票

当您

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

因此,当您调用

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

只有当 JS 事件循环重新获得控制权后,回调函数才能从队列中移除并真正被调用。


0
投票

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


0
投票

可以写return;解决后。它将在解析后停止代码运行。

像这样;

return new Promise(function(resolve, reject) {
    resolve();
    return;
    console.log("Not doing more stuff after a return statement");    
});
© www.soinside.com 2019 - 2024. All rights reserved.