Node中的批处理和排队API调用

时间:2018-12-13 15:37:26

标签: node.js async-await

我遇到了一个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)

1 个答案:

答案 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');
     });
}