NodeJS 由于多个API调用,脚本运行时间较长

uujelgoq  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(165)

我正在运行三个API请求,它们使我的JS脚本非常慢。
目标是从API获取数据并将其推送到数据库。
前两个API使用datenext_page_token调用。因此,在有下一个页面令牌之前,我一直调用这两个API。我称之为递归。
我将从上面获得的id存储在一个数组中,并将其传递给下面的两个API。
最后一个API调用在循环中运行。我每次都循环遍历id并调用API。
代码:

export async function getFirstAPI(access_token, start, end, globalObject){
       let url = 'baseAPI/meetings/from=start/to=end/next_page_token=globalObject.next_page_token';
        var obj = {
            method: 'GET',
            headers: {
            authorization: 'Bearer {yourtokenhere}'
            }
         }

     let response = await fetch(url, obj)
     let data = await response.json()

     return data
}

export async function getSecondAPI(access_token, start, end, globalObject){
       let url = 'baseAPI/chats/from=start/to=end/next_page_token=globalObject.next_page_token';
        var obj = {
            method: 'GET',
            headers: {
            authorization: 'Bearer {yourtokenhere}'
            }
         }

     let response = await fetch(url, obj)
     let data = await response.json()

     return data
}

export async function getThirdAPI(access_token, id_array, globalObject){

 for(let i=0; i<id_array.length; i++){
       let url = 'baseAPI/participants/{id}';
        var obj = {
            method: 'GET',
            headers: {
            authorization: 'Bearer {yourtokenhere}'
            }
         }

     let response = await fetch(url, obj)
     let data = await response.json()
     globalObject.store_data.push(data)
   }

 return globalObject
 
}

字符串
当我运行上面的一天。仅这一项就需要14分20秒。如果我运行它为一个更广泛的日期范围,我猜这将持续几个小时!
有什么方法可以优化这段代码吗?还是说跑起来要花这么长时间?
任何建议将是伟大的!

rbl8hiat

rbl8hiat1#

在循环中从await切换到Promise.allPromise.allSettled。它会工作得更快。等待不是一颗银。它有帮助,但在您的情况下,您正在等待每次迭代的响应,而不是..类似于“全部启动并收集结果”

export async function getThirdAPI(access_token, id_array, globalObject) {
  const apiPromises = id_array.map(async (id) => {
    let url = `${baseAPI}/participants/${id}`;
    var obj = {
      method: 'GET',
      headers: { /* */ },
      authorization: `Bearer ${access_token}`
    }
    const response = await fetch(url, obj);
    return await response.json();
  });
  const results = await Promise.all(apiPromises);
  // in case globalObject.store_data is an array
  globalObject.store_data.push(...results);
  return globalObject;
}

字符串

相关问题