首页 > 解决方案 > 一起进行 700 个 API 调用并使用 AWS Lambda 合并数据

问题描述

我有一个任务,我必须进行 700 次 REST API 调用。我使用了一个循环,但是循环的运行时间超过了 AWS Lambda 服务的超时时间。有什么方法可以同时拨打电话并合并结果。我正在使用节点 JS,但也欢迎使用 python 中的解决方案

这是我现在正在运行的代码示例:

HitBTCData = {}
for item in exchanges:
    itemlist = item.split('-')
    response = requests.get('https://min- 
    api.cryptocompare.com/data/histominute? 
    fsym='+itemlist[0]+'&tsym='+itemlist[1]+'&limit=2000&aggregate=1
    &e=HitBTC').json()

    if itemlist[0]+itemlist[1] not in HitBTCData:
        HitBTCData[itemlist[0]+itemlist[1]] = []
        HitBTCData[itemlist[0]+itemlist[1]].append(response['Data'])

    while response['Type'] != 1:
        time = response['TimeFrom']
        response = requests.get('https://min- 
        api.cryptocompare.com/data/histominute? 
        fsym='+itemlist[0]+'&tsym='+itemlist[1]+
       '&limit=2000&aggregate=1&toTs='+str(time)+'&e=HitBTC').json()

        if response['Type'] != 1:
          HitBTCData[itemlist[0]+itemlist[1]]
          .append(response['Data'])

    HitBTCData[itemlist[0]+itemlist[1]] = 
    HitBTCData[itemlist[0]+itemlist[1]][::-1]

标签: pythonnode.jsrestapiaws-lambda

解决方案


你可以很容易地做到这一点Promise.all()

const urls = [...];

const requestFunction = async (url) => {
    // all your ifs go here
    let data = await request(url);
    // transform/sanitize your data
    return data;
}

const allResults = await Promise.all(urls.map(requestFunction));
// you now have an array of results

唯一的缺点Promise.all()是,如果任何一个 Promise 被拒绝,一切都会失败。所以我建议捕捉错误并解决null或类似的东西。

你可以做一个for循环来生成你的 URL 数组new Array(700).map(...),或者因为看起来你已经有了某种数组,就.map()直接在请求函数中做更多的转换。


推荐阅读