我遇到了一个API,该API接收地址并向我返回GPS坐标。该API仅接受一个地址,但可以在任何给定时间处理50个实时连接。我正在尝试构建一个函数,该函数将发送50个请求,等到它们全部返回并再发送50个。或发送50个请求并发送下一个作为前一个返回。以下是我一直在使用的代码,但我遇到了麻烦。
batchFunct
中有一个问题。 for
循环发送所有API调用,不等待它们返回,然后在更新returned
之前运行if语句。这是因为考虑了Node的异步性。我试图将await
放在API调用上,但这似乎停止了所有异步过程(对此有任何澄清),并有效地使其一次发送一个请求。
关于修改此代码或寻找更好的批处理和排队API请求方法的建议吗?
const array = ['address1', 'address2', 'address3', 'address4', '...', 'addressN']
function batchFunc(array) {
return new Promise(function (resolve, reject) {
var returned = 1
for (let ele of array) {
apiCall(ele).then(resp => { //if but an await here it will send one at a time
console.log(resp)
returned++
})
};
if (returned == array.length) {
resolve(returned);
}
})
}
async function batchCall(array) {
while (array.length > 0) {
let batchArray = []
if (array.length > 50) {
for (let i = 0; i < 50; i++) {
batchArray.push(array[0])
array.splice(0, 1)
}
} else {
batchArray = array
array = []
}
let result = await batchFunc(batchArray);
console.log(result);
}
}
batchCall(array)
答案 0 :(得分:0)
我最终使用了async.queue,但是我对其他解决方案仍然很感兴趣。
const array = ['address1', 'address2', 'address3', 'address4', 'address5', 'address6']
function asyncTime(value) {
return new Promise(function (resolve, reject) {
apiCall(ele).then(resp => {
resolve(resp)
})
})
}
function test(array) {
var q = async.queue(async function(task, callback) {
console.log(await asyncTime(task))
if(callback) callback()
}, 3);
q.push(array, function(err) {
if (err) {
console.log(err)
return
}
console.log('finished processing item');
});
}