[英]how to merge response array run multiple ajax calls before resolving a promise
[英]run multiple ajax calls before resolving a promise
我有一个函数可以进行ajax调用并用结果来解决promise。 不幸的是,API将结果限制为100,我需要使用offset参数来获取下一个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();
});
});
};
最好的方法是为每个ajax调用创建一个Promise,然后使用Promise.all()确定何时成功完成所有请求。
类似于下面的代码段。 仅当所有呼叫成功后,此承诺才会解决。 请记住,如果任何ajax请求失败,它将永远无法解决,因此值得添加一些东西来处理它。
let currentOffset = 0;
let totalCount;
let offsetCount;
const makeCall = function(camp) {
let apiPromises = [];
// Repeat the below for each ajax request
apiPromises.push(
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();
});
}));
return Promise.all(apiPromises);
};
您可以使用第一个调用来确定选项的数量,然后创建所需数量的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);
});
});
};
有一些细节需要填写,但是应该有要点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.