Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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 有人能解释一下为什么要在最后一次打印时设置超时吗?_Javascript_Node.js_Event Loop - Fatal编程技术网

Javascript 有人能解释一下为什么要在最后一次打印时设置超时吗?

Javascript 有人能解释一下为什么要在最后一次打印时设置超时吗?,javascript,node.js,event-loop,Javascript,Node.js,Event Loop,当我在repl上运行它时,预期的输出与这里描述的完全不同 它给出了repl在这里的输出 我的理解与预期一致 next tick1 next tick2 next tick3 promise1 resolved promise2 resolved promise3 resolved promise4 resolved promise5 resolved next tick inside promise resolve handler set timeout set immediate1 set i

当我在repl上运行它时,预期的输出与这里描述的完全不同

它给出了repl在这里的输出

我的理解与预期一致

next tick1
next tick2
next tick3
promise1 resolved
promise2 resolved
promise3 resolved
promise4 resolved
promise5 resolved
next tick inside promise resolve handler
set timeout
set immediate1
set immediate2
set immediate3
set immediate4



我在这里读它是因为setTimeout是异步的。你把它放在代码的什么地方并不重要

请检查此链接以供参考-


你的麻烦是IO造成的

如果在本地Node.js安装中运行,那么代码的输出就可以了

在repl中,这并不是因为存在一个IO操作来切换立即和超时的执行

您可以在本地复制它:

"严格使用",; 常量fs=需要“fs” promise1 resolve.then=>console.log'promise1 resolved'; promise2 resolve.then=>console.log'promise2 resolved'; Promise.resolve.then=>{ 控制台。日志“承诺3已解决”; process.nextTick=>console.log'next tick in promise resolve handler'; }; Promise.resolve.then=>console.log'promise4 resolved'; Promise.resolve.then=>console.log'promise5 resolved'; setImmediate=>console.log'setimmediate1'; setImmediate=>console.log'setimmediate2'; process.nextTick=>console.log'next tick1'; process.nextTick=>console.log'next tick2'; process.nextTick=>console.log'next tick3'; fs.readFile\uuu文件名=>{ setTimeout=>console.log'setTimeout+2',0; setImmediate=>console.log'setImmediate+5'; setImmediate=>console.log'setImmediate+6'; }; setTimeout=>console.log'set timeout',0; setImmediate=>console.log'setimmediate3'; setImmediate=>console.log'setimmediate4'; 打印:

next tick1
next tick2
next tick3
promise1 resolved
promise2 resolved
promise3 resolved
promise4 resolved
promise5 resolved
next tick inside promise resolve handler
set timeout
set immediate1
set immediate2
set immediate3
set immediate4
set immediate +5
set immediate +6
set timeout +2
真相的唯一来源是:
我认为repl.it对您在GUI中编写的代码应用了一些逻辑,因此setImmediate将进入轮询阶段,而不是检查阶段,因此它将被切换。

好的,MDN说此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容性,并且行为可能会在将来发生变化。“因此无法按预期工作似乎是setImmediate的内置功能。谢谢,我想通过此了解代码在NodeJs环境中如何执行,这将首先执行,以及它如何通过事件循环。@AnupamBharti-有趣的是,我得到了您在我的本地主机上使用10.15.0节点窗口时所期望的响应。”。我在repl.it上得到了与您相同的第二个版本,也是10.15.x版本。@libik在我的localhost和repl上都是一样的,localhost是8.10.0 Linux,它给了我一个headache@AnupamBharti-那么看起来windows和linux发行版可能有点不同。我理解setTimeout的本质,但它不应该基于事件循环中的阶段执行吗?请看注释@libik获得这两个输出。它还提供与repl.It中相同的输出。如果您尝试在本地控制台中直接运行代码,我们是否可以说它不是repl.It GUI?它是将事件循环置于轮询阶段的节点控制台,如果是,则有意义:
next tick1
next tick2
next tick3
promise1 resolved
promise2 resolved
promise3 resolved
promise4 resolved
promise5 resolved
next tick inside promise resolve handler
set timeout
set immediate1
set immediate2
set immediate3
set immediate4


next tick1
next tick2
next tick3
promise1 resolved
promise2 resolved
promise3 resolved
promise4 resolved
promise5 resolved
next tick inside promise resolve handler
set timeout
set immediate1
set immediate2
set immediate3
set immediate4
set immediate +5
set immediate +6
set timeout +2