为了账号安全,请及时绑定邮箱和手机立即绑定

异步函数执行的顺序

异步函数执行的顺序

梦里花落0921 2022-01-13 11:05:36
我正在处理一个旧的代码库,并面临这种情况,在解决承诺后我很难理解执行顺序。我更熟悉 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?它甚至需要任何重构吗?
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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

当相关的承诺解决时,该then函数将触发。这就是异步代码的意义所在。它会消失,直到它准备好做下一件事。

我们可以用 Promise.all 重构它

在对结果值执行任何操作之前,您可以使用Promise.all等到多个承诺得到解决,但这将是低效的,除非then函数 forC需要来自Aor的数据B


查看完整回答
反对 回复 2022-01-13
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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.


查看完整回答
反对 回复 2022-01-13
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信