异步函数执行顺序

时间:2019-11-27 09:59:20

标签: javascript promise

我正在处理一个旧的代码库,并且遇到这种情况,即在兑现承诺后,我很难理解执行的顺序。我对async / await语法或一串then-s较为熟悉,但对这一语法则不熟悉。这是代码段:

_loadCaseDetail: funciton (arg1, arg2, arg3) {
  var oDataModel = this.getOwnerComponent().getModel('db2');

  loadLatestDatasetVersion(oDataModel).then(function (datasetVersion) {
    // do something
  });

  loadCountries(oDataModel).then(function (countries) {
    // do something
  });

  numberOfRulesetChanges(oDataModel).then(function (elements) {
    // do something
  });

  return fireImplicitLock(caseUuid).then(function (lockData) {
    // do something
  }).then(function () {
    // do something
  })
}

loadLatestDatasetVersionloadCountriesnumberOfRulesetChangesfireImplicitLock-所有回报承诺

我的问题是:在这种情况下,这些承诺之后的所有then-s的顺序是什么?

它是完全按顺序排列还是不按顺序排列,我们可以使用Promise.all进行重构吗?

它甚至需要任何重构吗?

2 个答案:

答案 0 :(得分:2)

  

在这种情况下,这些承诺之后的所有then-s的顺序是什么?

相关联的承诺解决后,then函数将触发。这就是异步代码的重点。它消失了,直到准备好做下一件事情为止。

  

我们可以说Promise.all

您可以使用Promise.all等到多个promise被解决,然后再对结果值执行任何操作,但这将是无效的,除非then的{​​{1}}函数需要来自{{ 1}}或C

答案 1 :(得分:1)

loadLatestDatasetVersionloadCountriesnumberOfRulesetChangesfireImplicitLock-所有返回承诺都将一个接一个地插入到事件循环中。

then一旦解决了承诺,部分承诺将被执行。哪个承诺then将被执行取决于相应的promise的执行。

_loadCaseDetail: funciton (arg1, arg2, arg3) {
  var oDataModel = this.getOwnerComponent().getModel('db2');

  loadLatestDatasetVersion(oDataModel).then(function (datasetVersion) {
    // do something
  });

  loadCountries(oDataModel).then(function (countries) {
    // do something
  });

  numberOfRulesetChanges(oDataModel).then(function (elements) {
    // do something
  });

  return fireImplicitLock(caseUuid).then(function (lockData) {
    // do something
  }).then(function () {
    // do something
  })
}

Promise.all就像是一扇门,您可以在其中传递诺言数组,并且只有在所有诺言得到解决后才能解决。

let p1 = Promise.resolve(loadLatestDatasetVersion(oDataModel));

let p2 = Promise.resolve(loadCountries(oDataModel));

let p3 = Promise.resolve(numberOfRulesetChanges(oDataModel));

let p4 = Promise.resolve( fireImplicitLock(caseUuid)

let finalPromise = Promise.all([p1,p2,p3,p4]);

finalPromise.then(([datasetVersion,countries,elements,lockData])=>{

    // do something here with datasetVersion, countries, elements, lockData you have all the params cause all the promises are resolved.

})

使用Promise.all可以实现相同的效果,如上所示。

More about promises

return fireImplicitLock(caseUuid).then(function (lockData) {
    // do something
  }).then(function () {
    // do something
  })

上一行将不会从诺言中返回任何结果,它将返回状态为Promise objectresolved/pending/rejected的{​​{1}}。