我正在处理一个旧的代码库,并且遇到这种情况,即在兑现承诺后,我很难理解执行的顺序。我对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的顺序是什么?
它是完全按顺序排列还是不按顺序排列,我们可以使用Promise.all
进行重构吗?
它甚至需要任何重构吗?
答案 0 :(得分:2)
在这种情况下,这些承诺之后的所有then-s的顺序是什么?
相关联的承诺解决后,then
函数将触发。这就是异步代码的重点。它消失了,直到准备好做下一件事情为止。
我们可以说Promise.all
您可以使用Promise.all
等到多个promise被解决,然后再对结果值执行任何操作,但这将是无效的,除非then
的{{1}}函数需要来自{{ 1}}或C
。
答案 1 :(得分:1)
loadLatestDatasetVersion
,loadCountries
,numberOfRulesetChanges
,fireImplicitLock
-所有返回承诺都将一个接一个地插入到事件循环中。
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
可以实现相同的效果,如上所示。
return fireImplicitLock(caseUuid).then(function (lockData) {
// do something
}).then(function () {
// do something
})
上一行将不会从诺言中返回任何结果,它将返回状态为Promise object
和resolved/pending/rejected
的{{1}}。