异步操作的承诺链接
Promises chaining of asynchronous actions
考虑 ui5/javascript 中的以下代码。在 for 循环内,代码应始终按以下顺序执行:getData1、getData2、fnc1(i)、getData3、getData4、fnc2(i),在调用函数 fnc3() 之前对每个“i”执行。截至目前,在 i 递增之前调用 fnc3:
for (var i = 0; i <= intNum; i++) {
getData1(url1, true).then(function() {
getData2(url2, true).then(function() {
fnc1(i);
getData3(url3, true).then(function() {
getData4(url4, true).then(function() {
fnc2(i);
})
})
})
})
}
fnc3();
所有四个 getData 函数都执行一些操作,然后 return 一个承诺。
function getData() {
var oModel = new JSONModel();
return oModel.loadData(url, true); //asynchronous loading data and returns a promise
}
任何解决方案如何让它工作?任何帮助表示赞赏。谢谢
您正在回调地狱中转换承诺,return 每个承诺并将其与 then
正确链接。在 for 循环中也使用 let
而不是 var
,var
不是块范围的。你可以在最后 then
块添加一个 if 语句到 运行 fn3
:
for (let i = 0; i <= intNum; i++) {
getData1(url1, true)
.then(() => getData2(url2, true))
.then(() => {
fnc1(i)
return getData3(url3, true)
})
.then(() => getData4(url4, true))
.then(() => {
fnc2(i)
if(i === intNum) fnc3()
})
}
考虑 ui5/javascript 中的以下代码。在 for 循环内,代码应始终按以下顺序执行:getData1、getData2、fnc1(i)、getData3、getData4、fnc2(i),在调用函数 fnc3() 之前对每个“i”执行。截至目前,在 i 递增之前调用 fnc3:
for (var i = 0; i <= intNum; i++) {
getData1(url1, true).then(function() {
getData2(url2, true).then(function() {
fnc1(i);
getData3(url3, true).then(function() {
getData4(url4, true).then(function() {
fnc2(i);
})
})
})
})
}
fnc3();
所有四个 getData 函数都执行一些操作,然后 return 一个承诺。
function getData() {
var oModel = new JSONModel();
return oModel.loadData(url, true); //asynchronous loading data and returns a promise
}
任何解决方案如何让它工作?任何帮助表示赞赏。谢谢
您正在回调地狱中转换承诺,return 每个承诺并将其与 then
正确链接。在 for 循环中也使用 let
而不是 var
,var
不是块范围的。你可以在最后 then
块添加一个 if 语句到 运行 fn3
:
for (let i = 0; i <= intNum; i++) {
getData1(url1, true)
.then(() => getData2(url2, true))
.then(() => {
fnc1(i)
return getData3(url3, true)
})
.then(() => getData4(url4, true))
.then(() => {
fnc2(i)
if(i === intNum) fnc3()
})
}