繁体   English   中英

承诺和行动顺序

[英]Promises and Order of Operations

抱歉,这是一个基本概念。 我是Java的新手。

我试图了解以下功能的执行顺序。 之后,我设置了一个带有2个回调的Promise和一个带有3个回调的Promise。

function getSum(n1, n2){
    var isAnyNegative = function() {
        return n1<0 || n2 < 0;
    }
    var promise = new Promise(function(resolve, reject) {
        if (isAnyNegative()){
            reject(Error('Negative not supported'));
        }
        resolve(n1 + n2)
    });
    return promise;
}

// Double Promise
getSum(5,6).then(function(result) {
  console.log('DL1 '+result);
  return getSum(10,20);
}, function(error){
  console.log(error);
}).then(function(result) {
  console.log('DL2 '+result);
}, function(error){
  console.log(error);
});

// Triple Promise
getSum(5,6).then(function(result) {
  console.log('TL1 '+result);
  return getSum(10,20);
}, function(error){
  console.log(error);
}).then(function(result){
  console.log('TL2 '+result);
  return getSum(30,40);
}, function(error){
  console.log(error);
}).then(function(result){
  console.log('TL3 ' +result);
}, function(error){
  console.log(error);
});

输出如下(DL =>双层,TL =>三层):

DL1 11
TL1 11
DL2 30
TL2 30
TL3 70

期望输出是双层然后是三层,但是事实并非如此。 我研究了吊装,但据我了解,它至少应该保护脚本中的执行顺序。 这些函数如何排序,为什么不按出现顺序执行?

如果需要更多详细信息,请先向“道歉”和“谢谢”提出问题。

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

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

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

如果您真的需要诺言先解决DL,然后再解决TL,则需要使它们成为同一诺言链的一部分

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

当涉及异步操作(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. 因为在步骤5中解决了Promise DL,所以运行了DL1 .then() 。在后台解决了Promise TL。
  7. 因为在步骤6中解决了Promise TL,所以运行TL1 .then() 。DL1在后台解决。
  8. 因为在步骤7中已解决Promise DL1,所以运行了DL2 .then() 。在后台解决了Promise TL1。
  9. ...(您知道了)

如您所见,使用Promises,一些操作在后台运行。 这就是为什么您会看到执行顺序可能看起来不一样的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM