Promise中同步执行的顺序
Order of synchronous execution in Promise
我在事件监听器中测试Promise时遇到了一个问题。一切都很好,只是执行命令。
var test = document.querySelector('#test');
test.addEventListener('click',function(){
Promise.resolve().then(function(){
throw 'first';
}).catch(function(er){
console.log(er);
});
});
test.addEventListener('click',function(){
console.log('second');
});
test.click();
<div id="test"></div>
为什么第二个听众比第一个听众提前结束?
根据标准要求,它的行为如下:
- 否则,如果promise的
[[PromiseState]]
内部插槽的值为"fulfilled"
,
a.设value为promise的[[PromiseResult]]
内部插槽的值
b.执行EnqueueJob("PromiseJobs", PromiseReactionJob, «fulfillReaction, value»)
- 否则,如果promise的
[[PromiseState]]
内部插槽的值为"rejected"
,
a.设原因为promise的[[PromiseResult]]
内部槽的值
b.执行EnqueueJob("PromiseJobs", PromiseReactionJob, «rejectReaction, reason»)
因此,当promise被解析或拒绝时,相应的回调将被安排在稍后与当前执行异步运行。
参考文献:
- 25.4.5.3.1
PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability )
- 8.4.1
EnqueueJob (queueName, job, arguments)
第二个侦听器不依赖于第一个侦听器(promise),因此它们异步工作。为什么要把它们分开?您可以简单地使用以下代码
Promise
.resolve()
.then(function(){
throw 'first';
})
.catch(function(er){
console.log(er);
})
.finally(function(er) {
console.log('second');
};
});
相关文章:
- 使用appendChild()动态添加的脚本是按顺序执行还是并行执行
- 如何在angularjs中按顺序执行多数据ng应用程序
- 要按顺序执行的异步代码
- AngularJS:如何按照预定义的顺序执行函数
- 按顺序执行导入的 Javascript 函数
- 无法让 jQuery 以正确的顺序执行代码
- 触发后的 Javascript 顺序执行
- $http.post() angularjs 响应函数未按正确的顺序执行
- 如何按顺序执行 jQuery 函数
- 为什么Javascript不按顺序执行代码
- 对象在循环中运行时未定义,但在按顺序执行时未定义
- 按顺序执行ajax请求的动态编号
- javascript在网络上的顺序执行
- SQL语句是通过PhoneGap'按顺序执行的吗;的Web SQL数据库
- jQuery Deferred和Promise用于同步和异步函数的顺序执行
- 顺序执行js
- 如何按顺序执行承诺数组
- 有没有更好的方法以一定的顺序执行一堆部分异步的jQuery函数
- 如何确保 Dojo 模块按特定顺序执行
- 为什么我的 JavaScript 不能按顺序执行