首页 >web前端 >js教程 >为什么 JavaScript Promise 执行顺序不像预期的那样是线性的?

为什么 JavaScript Promise 执行顺序不像预期的那样是线性的?

DDD
DDD原创
2024-10-24 13:23:31617浏览

Why is the JavaScript Promise execution order not linear as expected?

JavaScript Promise 执行顺序

问题

考虑以下使用 Promise 的 JavaScript 代码:

<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>

输出如下:

<code class="text">1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6</code>

问题是关于执行顺序的,具体是数字1、2、3、7等等。为什么不是预期的线性顺序 1, 2, 3, 4, ...?

答案

Promise 执行顺序

JavaScript Promise 遵循特定的执行规则:

  1. 异步执行: Promise .then() 处理程序在当前执行线程完成后异步执行。这是为了确保异步操作可以在不阻塞主线程的情况下完成。
  2. 嵌套 Promise: 在 .then() 处理程序中创建新的 Promise 而不返回它们会创建独立的 Promise 链。这些独立的 Promise 链没有可预测的执行顺序。

顺序分析

在给定的代码中:

  • 初始 Promise 会立即解析,所以它的 .then() 处理程序 (console.log(2, a)) 在 console.log(1) (第 23 行)之后异步运行。
  • 第 4 行的 .then() 处理程序创建了一个独立的 Promise 链
  • 第 12 行的 .then() 处理程序创建了另一个异步运行的独立 Promise 链。
  • 第 19 行的 .then() 处理程序创建了另一个独立的 Promise 链,异步运行。
  • setTimeout() 设置在当前执行线程完成后运行的回调,但不保证在 Promise .then() 处理程序之前或之后运行。

非确定性执行

由于 .then() 处理程序中创建的独立 Promise 链没有可预测的执行顺序,因此 3、7、4、8、9、5、10 的顺序取决于具体的 Promise 引擎实现。

建议

为了确保异步操作的特定执行顺序,建议:

  1. 避免在 .then 中创建独立的 Promise 链() 处理程序。
  2. 链接 Promise 链以确保特定的执行顺序。

在给定的示例中,从 .then( 返回 Promise.resolve('C') Promise ) 第 4 行的处理程序将链接承诺链并产生预期的顺序执行顺序。

以上是为什么 JavaScript Promise 执行顺序不像预期的那样是线性的?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn