最近,我读了一篇有关Javascript EventLoop的文章。但是,当我将代码放入Visual Studio Code中执行时,会有一些不同的结果。我很困惑。感谢您的帮助!
代码如下:
console.log('1');
// written as set1
setTimeout(function () {
console.log('2');
// written as set4
setTimeout(function() {
console.log('3');
});
// written as pro2
new Promise(function (resolve) {
console.log('4');
resolve();
}).then(function () {
console.log('5')
})
})
// written as pro1
new Promise(function (resolve) {
console.log('6');
resolve();
}).then(function () {
console.log('7');
// written as set3
setTimeout(function() {
console.log('8');
});
})
// written as set2
setTimeout(function () {
console.log('9');
// written as pro3
new Promise(function (resolve) {
console.log('10');
resolve();
}).then(function () {
console.log('11');
})
})
结果可能是以下之一:
1,6,7,2,4,9,10,8,5,11,3
1,6,7,2,4,9,10,5,11,8,3
答案 0 :(得分:1)
Nita,您好,欢迎来到Stack Overflow。
浏览器中日志出现的顺序是由HTML5标准中的一项要求确定的,该要求是在对计时器队列中已到期的计时器执行 any 回调之前执行已解决(已履行)承诺的回调。
相对于主机环境中的其他异步事件,ECMAScript规范本身并未尝试定义承诺作业的执行优先级,该承诺作业在保证金结算后执行对处理程序的回调。
>Promise.then Job execution order的答案会更详细,并提供相关标准的链接。
因此,对于兼容HTML5的浏览器,日志顺序为
1, 6, 7, 2, 4, 5, 9, 10, 11, 8, 3
因为执行在已实现的承诺上设置的处理程序回调优先于计时器回调。
HTML5标准并未规定计时器的相对优先级,并承诺在非浏览器环境(例如Node.js)中进行回调。
因此,向控制台发送的日志顺序之间的差异可以归因于主机环境的差异。
扎根的想法是设置代码以依赖计时器之间的争用条件结果,并且Promise Callbacks有点脆弱-它依赖于宿主环境的实现。