猿问

异步函数执行的顺序

我正在处理一个旧的代码库,并面临这种情况,在解决承诺后我很难理解执行顺序。我更熟悉 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

  })

}

loadLatestDatasetVersion, loadCountries, numberOfRulesetChanges, fireImplicitLock- 所有返回承诺


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


它是否完全按顺序排列,或者不是,我们可以用 say 重构它Promise.all?


它甚至需要任何重构吗?


梦里花落0921
浏览 171回答 2
2回答

素胚勾勒不出你

在这种情况下,这些承诺之后的所有 then-s 的顺序是什么?当相关的承诺解决时,该then函数将触发。这就是异步代码的意义所在。它会消失,直到它准备好做下一件事。我们可以用 Promise.all 重构它在对结果值执行任何操作之前,您可以使用Promise.all等到多个承诺得到解决,但这将是低效的,除非then函数 forC需要来自Aor的数据B。

神不在的星期二

loadLatestDatasetVersion, loadCountries, numberOfRulesetChanges, fireImplicitLock- 所有返回承诺,它们将一个接一个地插入到事件循环中。then一旦 Promise 被解决,一部分 Promise 将被执行。哪个 promisethen将被执行取决于各自的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您可以使用如上所示实现相同的目标。return fireImplicitLock(caseUuid).then(function (lockData) {    // do something  }).then(function () {    // do something  })上面的行不会从 Promise 中返回任何结果,它会返回Promise object它的状态resolved/pending/rejected和value.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答