在节点中对API调用进行批处理和排队



我正在访问一个API,它接收地址并返回GPS坐标。API只接受一个地址,但它可以在任何给定的时间处理50个实时连接。我正在尝试构建一个函数,它将发送50个请求,等待它们全部返回,然后再发送50个。或者发送50个请求,并在返回前一个请求时发送下一个请求。下面是我一直在使用的代码,但我被卡住了。

batchFunct中存在一个问题。for循环发送所有API调用,不等待它们返回,然后在更新returned之前运行if语句。这使得考虑到Node的异步性。我试图在API调用上放置await,但这似乎停止了所有异步进程(任何人都对此有澄清(,并有效地使其一次发送一个请求。

关于修改此代码或找到更好的批处理和排队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)

我最终使用了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');
});
}

最新更新