Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js事件循环,setTimeout和Promise.then的执行顺序不稳定_Javascript_Node.js_Libuv - Fatal编程技术网

Javascript node.js事件循环,setTimeout和Promise.then的执行顺序不稳定

Javascript node.js事件循环,setTimeout和Promise.then的执行顺序不稳定,javascript,node.js,libuv,Javascript,Node.js,Libuv,代码是: setTimeout(function () { console.log('setTimeout1') Promise.resolve().then(function () { console.log('promise') }); }) setTimeout(function () { console.log('setTimeout2'); }); 我阅读了node.js的文档,了解了事件循环的6个阶段。 但是我不明白为什么代码的输出是

代码是:

setTimeout(function () {
    console.log('setTimeout1')
    Promise.resolve().then(function () {
        console.log('promise')
    });
})
setTimeout(function () {
    console.log('setTimeout2');
});
我阅读了node.js的文档,了解了事件循环的6个阶段。 但是我不明白为什么代码的输出是不稳定的? 我认为输出应该是(环境:node.js 8.6.0)

但结果是

setTimeout1
promise
setTimeout2


也许与“微任务”有关?也许值得注意的是,在firefox中,上述代码总是(至少就我所尝试的)产生
setTimeout1、promise、setTimeout2
谢谢@Jaromanda X的评论。但是node.js和browser之间的事件循环模型可能不同。很抱歉,我没有提到文本上方的node 8.6.0环境中运行的代码。我只是注意到了其中的差异。我也看到了95%的
1,2,p
顺序和5%的
1,p,2
(在node 10.0.0中)-老实说,我期待
1,p,2
顺序(因为这也是你在Chrome浏览器中得到的顺序-nodejs不应该使用Chrome js引擎吗?)@Mark_M setTimeout()没有延迟参数默认设置为1。它与process.nextTick()不同。
setTimeout1
promise
setTimeout2
setTimeout1
setTimeout2
promise