为什么Javascript EventLoop会有不同的结果?

时间:2018-10-20 02:12:01

标签: javascript

最近,我读了一篇有关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

1 个答案:

答案 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有点脆弱-它依赖于宿主环境的实现。