我有一个函数可以调用ajax并使用结果解析一个promise。不幸的是,API将结果限制为100,我需要使用偏移参数来获得下一个100,依此类推。在解决承诺之前,如何进行所有需要的ajax调用(API响应提供值的总数,以便我可以确定要调用的调用次数)?
这是我用来获得前100个然后解决的函数:
let currentOffset = 0;
let totalCount;
let offsetCount;
const makeCall = function(camp) {
return new Promise(function(resolve, reject) {
api.get(camp, currentOffset, e => {
totalCount = e.totalCount;
offsetCount = Math.floor(totalCount / 100)
let payload = e.payload;
for (var a in payload) {
myArray.push({
'id': payload[a].id,
'text': payload[a].text,
'url': ads[a].url,
});
}
resolve();
});
});
};
答案 0 :(得分:1)
执行此操作的最佳方法是为每个ajax调用创建一个Promise,然后使用Promise.all()确定所有请求何时成功。
类似下面的代码段。只有在所有呼叫成功后,此承诺才会解决。请记住,如果任何ajax请求失败,它将永远无法解决,因此可能值得添加一些东西来处理它。
order
答案 1 :(得分:1)
您可以使用第一个调用来确定选项的数量,然后创建所需数量的ajax调用以获取其余值以及每个ajax调用的相应承诺。一旦所有其他ajax调用完成,解决第一个承诺。这部分可以使用Promise.all()完成。
let currentOffset = 0;
let totalCount;
let offsetCount;
const makeCall = function(camp) {
// Repeat the below for each ajax request
return new Promise(function(resolve, reject) {
let apiPromises = [];
api.get(camp, currentOffset, e => {
totalCount = e.totalCount;
offsetCount = Math.floor(totalCount / 100)
let payload = e.payload;
for (var a in payload) {
myArray.push({
'id': payload[a].id,
'text': payload[a].text,
'url': ads[a].url,
});
}
for (var numCalls = 1; numCalls < offsetCount; numCalls++) {
// Increment currentOffset here
apiPromises.push(new Promise(function() {
api.get(camp, currentOffset, e => {
// Add each value to array
}
}
}
Promise.all(apiPromises).then(resolve);
});
});
};
有一些细节要填写,但这应该有它的要点。