Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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_Promise - Fatal编程技术网

Javascript 承诺。然后是作业执行命令

Javascript 承诺。然后是作业执行命令,javascript,promise,Javascript,Promise,(第5段): 来自单个作业队列的挂起作业记录始终在中启动 先进先出顺序。本规范未定义以下操作的顺序: 为多个作业队列提供服务。可以使用ECMAScript实现 交织作业未决作业记录的FIFO评估 评估一个或多个待处理作业记录的队列 其他工作队列 这是否意味着我不能指望提供给的回调。然后在同步控制流中,在提供给setTimeout的回调之前对进行评估 换句话说,我可以依赖以下打印一两个 setTimeout(()=>console.log('two'); 然后(()=>console.log('

(第5段):

来自单个作业队列的挂起作业记录始终在中启动 先进先出顺序。本规范未定义以下操作的顺序: 为多个作业队列提供服务。可以使用ECMAScript实现 交织作业未决作业记录的FIFO评估 评估一个或多个待处理作业记录的队列 其他工作队列

这是否意味着我不能指望提供给
的回调。然后在同步控制流中,在提供给
setTimeout
的回调之前对
进行评估

换句话说,我可以依赖以下打印
一两个

setTimeout(()=>console.log('two');

然后(()=>console.log('one')
setTimeout
并不意味着提供的函数将在提供的时间之后执行。一旦延迟过去,它会将函数添加到队列的末尾

这实际上取决于你的承诺何时达成,以及这两个声明的执行情况。在您的示例中,
setTimeout
将在解析的承诺之前将其回调添加到队列中,因此您可以预期
one-two

这是否意味着我不能指望提供给
的回调。然后在同步控制流中,在提供给
setTimeout
的回调之前对
进行评估

是的,这就是它的意思;规范不要求实现以这种方式工作

但在实践中,我测试过的带有本机
Promise
支持的实现在完成调度它的“宏任务”后立即调度
然后
回调(PendingJobs队列中的“微任务”),然后是其他挂起的宏任务,即使挂起的宏任务在微任务之前调度。(
setTimeout
和事件都是宏任务。)

例如,在我测试过的环境中,这会可靠地输出
A
C
B

console.log(“A”);
setTimeout(=>console.log(“B”),0);

然后(=>console.log(“C”)是的,这就是它的意思-在promise回调之前可能会触发其他事件


不,这不会发生-虽然ECMAScript允许,但不允许。

我总是忘记
setTimeout
不在规范中!
setTimeout
规范如何/在何处说明当承诺解析排队时会发生什么?以下内容似乎相关:因此,用户代理必须使用以下定义来代替JavaScript规范中的定义。这些确保了JavaScript规范排队的promise作业正确地集成到用户代理的事件循环中。”@T.J.Crowder我的意思是整个HTML5规范使用其微任务队列和宏任务队列的概念定义了promise和timeout回调之间的关系。@BenAston我不这么认为,没有”规范“为了这一具体实施。在NodeJS中,承诺是在nextTick队列之后但在任何计时器或IO之前运行的。请注意,ES规范将此问题留给平台来决定-因此NodeJS和Chrome的工作方式略有不同。@BenjaminGruenbaum:谢谢,非常有用。Chrome没有的
nextTick
队列的唯一区别是什么?关闭,但所有在同一时间发生的动作(计时器、I/O)的事件处理程序都会在任何nextTick插槽之前启动。我已经做了以下要点以获取更多信息:相关: