开发者问题收集

承诺和操作顺序

2019-06-20
62

道歉,如果这是一个基本概念。 我是JavaScript的新手。

我正在尝试了解以下功能的执行顺序。 我设置了一个带有2个回调的承诺,然后立即使用3个回调的承诺。

546571540

输出如下(dl => double layer,tl => tly layer ):

418568782

它本来可以预期输出为双层,然后是三层层,但是事实并非如此。 我研究了提升,但是我已经阅读了它,它至少应该保护脚本中的执行顺序。 这些功能如何订购,为什么不以外观顺序执行它们?

如果需要更多详细信息,请提前询问,道歉和感谢。

2个回答

运行承诺时,每个 .then 处理程序都会异步运行,如 https://javascript.info/microtask-queue

基本上,对于您的代码来说,这意味着

  • 主代码首先运行,DL1 排队,TL1 排队
  • 当主代码执行结束时,DL1 首先进入队列,因此它执行并排队 DL2
  • 当引擎完成 DL1 时,它会获取下一个排队项目; TL1,执行并排队 TL2。
  • 现在队列中的下一个项目是 DL2,其余 TL 紧随其后

如果您确实需要承诺先解决 DL,然后再解决 TL,那么您需要让它们成为同一承诺链的一部分

2019-06-20

您示例中的执行顺序是正确的。

当涉及到异步操作(Promises)时,整个概念与同步操作略有不同。

在下面的解释中,您可以将 Promise 视为运行操作的计划/队列。

例如,使用此简化的代码:

function sum(a, b){
  return new Promise(function(resolve, reject){
    if (a < 0 || b < 0)
      reject(new Error('Negative not supported.'));
    else
      resolve(a + b);
  });
}


/* Double layer */
sum(5, 6).then(function(result){
  console.log('DL1', result);
  return sum(10, 20);
}).then(function(result){
  console.log('DL2', result);
}).catch(function(error){
  console.error(error);
});


/* Triple layer */
sum(5, 6).then(function(result){
  console.log('TL1', result);
  return sum(10, 20);
}).then(function(result){
  console.log('TL2', result);
  return sum(30, 40);
}).then(function(result){
  console.log('TL3', result);
}).catch(function(error){
  console.error(error);
});

如果我们遵循上述示例,执行队列将如下所示:

  1. 声明函数 sum
  2. 将函数 sum(5, 6) 作为 DL 运行。
  3. 返回 Promise(DL), sum (DL)的执行结束。
  4. 将函数 sum(5, 6) 作为 TL 运行。 Promise DL 在后台运行。
  5. 返回 Promise (TL), sum (TL) 的执行结束。Promise DL 在后台解析。
  6. DL1 .then() 运行,因为 Promise DL 已在步骤 5 中解析。Promise TL 在后台解析。
  7. TL1 .then() 运行,因为 Promise TL 已在步骤 6 中解析。DL1 在后台解析。
  8. DL2 .then() 运行,因为 Promise DL1 已在步骤 7 中解析。Promise TL1 在后台解析。
  9. ...(您明白了)

如您所见,使用 Promises,一些操作在后台运行。这就是为什么你会看到执行顺序可能与它出现的顺序不一样。

yqlim
2019-06-20