问题:
以下代码片段演示了 JavaScript 的使用Promise,而且执行顺序很耐人寻味。
<code class="javascript">Promise.resolve('A') .then(function(a){console.log(2, a); return 'B';}) .then(function(a){ Promise.resolve('C') .then(function(a){console.log(7, a);}) .then(function(a){console.log(8, a);}); console.log(3, a); return a;}) .then(function(a){ Promise.resolve('D') .then(function(a){console.log(9, a);}) .then(function(a){console.log(10, a);}); console.log(4, a);}) .then(function(a){ console.log(5, a);}); console.log(1); setTimeout(function(){console.log(6)},0);</code>
结果表明执行顺序是:
1 2 "A" 3 "B" 7 "C" 4 "B" 8 undefined 9 "D" 5 undefined 10 undefined 6
提出的问题是为什么执行顺序不是 1, 2 , 3, 4...,1, 2, 3, 4... 的期望与结果有何不同?
答案:
注释:
在 .then() 处理程序中运行 Promise,而不从 .then() 回调返回它们,会创建一个新的、独立的 Promise 序列,该序列不与任何父 Promise 同步。方式。这通常被认为是一个错误,一些承诺引擎在发生时会发出警告,因为它通常不是预期的行为。一个有效的用例可能是“即发即忘”操作,其中既不关心错误,也不关心同步。
.then() 处理程序中的 Promise.resolve() Promise 创建独立于父级运行的新 Promise 链链。对于实际的异步操作(例如 AJAX 调用),独立的、断开连接的 Promise 链没有可预测的行为。完成时间是不确定的,就像并行启动四个 AJAX 调用,但完成顺序未知。在提供的代码中,所有操作都是同步的,从而产生一致的行为,但不应依赖这一点,因为 Promise 的设计目的是异步执行。
总结:
逐行分析:
结论:
.then() 处理程序中的 Promise.resolve() 承诺执行缺乏特定的顺序,以及各种引擎的 .then() 处理程序调度与 setTimeout() 的不确定性,突出了通过链接承诺控制执行顺序的重要性。
以上是为什么 Promise 执行顺序与 JavaScript 中的期望不匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!