为什么Javascript事件循环有不同的结果?;

为什么Javascript事件循环有不同的结果?;,javascript,Javascript,最近,我读了一篇关于Javascript EventLoop的文章。但当我将代码放入VisualStudio代码中执行时,会出现一些不同的结果。我很困惑。谢谢你的帮助 代码如下: console.log('1'); // written as set1 setTimeout(function () { console.log('2'); // written as set4 setTimeout(function() { console.log('3')

最近,我读了一篇关于Javascript EventLoop的文章。但当我将代码放入VisualStudio代码中执行时,会出现一些不同的结果。我很困惑。谢谢你的帮助

代码如下:

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

你好,尼塔,欢迎来到Stack Overflow

浏览器中的日志出现顺序取决于HTML5标准中的一项要求,即在对计时器队列中的过期计时器执行任何回调之前,对已解决(已实现)的承诺执行回调

ECMAScript规范本身没有试图定义承诺作业的执行优先级,这些承诺作业在承诺结算后执行回调给当时的处理程序,与主机环境中的其他异步事件相关

答案更详细,并提供相关标准的链接

因此,对于兼容HTML5的浏览器,日志的顺序将是

 1, 6, 7, 2, 4, 5, 9, 10, 11, 8, 3
因为在已实现的承诺上设置的then处理程序回调的执行优先于计时器回调

HTML5标准没有规定非浏览器环境(如Node.js)中计时器和承诺回调的相对优先级

因此,控制台日志顺序之间的差异可归因于主机环境中的差异


带回家的思想是将代码设置为依赖计时器和承诺回调之间的竞争条件的结果,这是一个有点脆弱的练习-它依赖于主机环境实现。

EventLoop,Nodejs?嗯,我很困惑。我认为,当setTimeout完成时,javascript应该去处理像Promise这样的微任务;但是在set1之后,它将转到set2,而不是pro2,我对此感到困惑。谢谢你的帮助help@Ele-也可以是1 6 7 2 4 5 9 10 8 311@JaromandaX我不明白?