首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Javascript EventLoop有不同的结果?

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

Stack Overflow用户
提问于 2018-10-20 02:12:01
回答 1查看 79关注 0票数 3

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

以下是代码:

代码语言:javascript
复制
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');
    })
})

其结果可以是以下之一:

代码语言:javascript
复制
1,6,7,2,4,9,10,8,5,11,3

1,6,7,2,4,9,10,5,11,8,3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-20 03:40:26

你好,妮塔,欢迎来到堆栈溢出。

浏览器中日志外观的顺序是根据HTML5标准中的一个要求确定的,即在对计时器队列中的过期计时器执行任何回调之前,要执行已解决(已完成)承诺的回调。

ECMAScript规范本身不试图定义承诺作业的执行优先级,这些作业在承诺解决后执行对然后的处理程序的调用,涉及主机环境中的其他异步事件。

Promise.then Job execution order的答案将更详细,并提供相关标准的链接。

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

代码语言:javascript
复制
 1, 6, 7, 2, 4, 5, 9, 10, 11, 8, 3

因为执行在履行承诺的基础上设置的处理程序回调,所以优先于计时器回调。

HTML5标准没有规定定时器的相对优先级,并承诺在非浏览器环境(如Node.js )中进行回调。

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

带回家的想法是设置代码,以依赖计时器之间的竞争条件的结果,并且承诺回调是一项有点脆弱的工作--它依赖于主机环境的实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52901862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档