为什么javascript ES6 Promises在解析后继续执行
Why does javascript ES6 Promises continue execution after a resolve?
我知道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
JavaScript具有"运行到完成";。除非抛出错误,否则将执行函数,直到到达return
语句或其末尾。函数之外的其他代码不能干扰它(除非再次抛出错误)。
如果你想让resolve()
退出初始化器函数,你必须用return
:把它前置
return new Promise(function(resolve, reject) {
return resolve();
console.log("Not doing more stuff after a return statement");
});
规范仍然要求异步调用resolve
承诺时将调用的回调。这是为了确保在混合使用同步和异步操作的promise时行为一致。
因此,当您调用resolve
时,回调被排队,并且函数执行将立即继续,resolve()
调用之后的任何代码都将执行。
只有在JS事件循环被赋予控制权后,回调才能从队列中删除并实际调用。
resolve()
函数与return
完全不同。它只是表明,用then()
方法注册的回调函数的参数现在已经准备好了,回调函数可能会离开Job队列(或Micro任务队列),进入主JS调用堆栈,但只有当所有同步代码和在此之前进入队列的异步代码都完成运行时,才会发生这种情况。console.log("Not doing more stuff after a return statement");
代码中的这个语句是一个同步代码,它比异步代码具有优先级。这就是它运行第一个的原因
- 如何使我的javascript在页面加载后继续执行
- php,如果我点击按钮程序重新加载页面,并且从不继续执行代码
- Javascript渲染.如何编写Javascript;t在函数调用结束之前继续执行代码
- Javascript:在css动画之后继续执行
- 为什么javascript ES6 Promises在解析后继续执行
- 浏览器在“打开”之后继续执行Javascript;PageUnload”&新的“;PageLoad”;
- 停止 C# 在下拉列表 javascript 验证失败时继续执行服务器端脚本
- 代码只执行一次,但应该继续执行
- 等待 AJAX,然后再继续执行单独的函数
- 在 Mac 上的 Firebug 中继续执行脚本的快捷方式是什么?
- JSON 失败并继续执行代码
- onClick 事件,但仍继续执行 href 目标
- 如何在使用 window.onerror 处理语句 1 中的错误时继续执行语句 2
- 继续执行dom命令
- 如何停止执行CasperJS,让用户输入一些值,然后继续执行
- Sailsjs-返回res.json();后继续执行;
- 警报框打开时继续执行
- 如何刷新页面,然后继续执行操作
- 停止当前操作并继续执行另一个(新)操作
- 在客户端发出警报消息后继续执行代码