【发布时间】:2018-09-21 18:45:45
【问题描述】:
如何将.then 子句作为循环重复?我需要等待 .then 子句承诺解决,然后如果没有满足退出条件,我需要再次重复相同的操作......直到满足退出条件。
我的用例是对多个“页面”数据重复 ajax GET 调用,直到检索到所有数据。
我可以按如下方式简化和模拟问题。这是我想.thenRepeat 的 .then 子句:
.then(function(retData) {
namesList.push.apply(namesList, retData); // accum data into list
queryParms.pageNo++; // set to next page
return pretendAjaxFnc(queryParms); // get next page
})
这是一个可运行的例子:
function pretendAjaxFnc(obj) {
return Promise.resolve().then(function() {
if (obj.pageNo < 6) { // create a pretend "I'm done" point.
// return a couple dummy records
return [{ fld1: "data1", fld2: "data2" },
{ fld1: "data1", fld2: "data2" }];
} else {
// this is the exit criteria
// It will actually be 404 http status converted to a custom exception
throw new Error("NO-MORE-DATA");
}
});
};
function clientAccumulator() {
var namesList = [];
var queryParms = {
pageNo: 1
};
return pretendAjaxFnc(queryParms)
.then(function(retData) {
namesList.push.apply(namesList, retData); // append data to list
queryParms.pageNo++; // set to get next page
console.log("EIC.GTEST11 list.len: ", namesList.length);
return pretendAjaxFnc(queryParms);
})
// repeat until some exit criteria - like an exception
.then(function(retData) {
namesList.push.apply(namesList, retData);
queryParms.pageNo++;
console.log("EIC.GTEST21 list.len: ", namesList.length);
return pretendAjaxFnc(queryParms);
})
// repeat until some exit criteria - like an exception
.then(function(retData) {
namesList.push.apply(namesList, retData);
queryParms.pageNo++;
console.log("EIC.GTEST31 list.len: ", namesList.length);
return pretendAjaxFnc(queryParms);
})
// repeat until some exit criteria - like an exception
// ...
.catch(function(ex) {
if (ex.message === "NO-MORE-DATA") {
return namesList;
} else {
throw ex;
}
});
};
clientAccumulator(); // Run the function
这是需要在当前 iOS/Safari 和 Firefox 上运行的浏览器代码(尽管最好有更多变体)。我正在使用 AngularJS,但我相信我已经删除了任何这种特殊性。
有人有.thenRepeat 可以指点我吗?
【问题讨论】:
-
也许await 是你的朋友,如果你能够使用它(无论是原生还是 babel)?
-
在
while循环中使用await也可以,是的.. -
await- 是的,好主意。
标签: javascript promise