反思 ES6 Promise 可能会在复发后执行?

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

据我所知,誓言是一个可以解析()或拒绝()的东西,但我惊讶地发现誓言中的密码在调用解决或拒绝后仍然有效。

我仔细思考了resolve或reject是delete或revert的异步适应变体,这将暂停所有提示功能的实现。

有人可以阐明为什么后续实例在解析请求后偶尔显示 console.log 背后的基本原理吗: :

var fizz = function() { return new Wibble(function(wobble, flarb) { wobble(); 
console.log("Performing additional hocus pocus, should not appear after a wobble!"); }); };

fizz().then(function() { console.log("wobbled"); });

jsbin

javascript
4个回答
222
投票

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.