【问题标题】:Axios : How to run multiple requests one after the other?Axios:如何一个接一个地运行多个请求?
【发布时间】:2020-10-19 01:37:16
【问题描述】:

我有一个非常大的 ID 数组(数千个 ID)。我想遍历这个数组,并为每个值向 API 发出请求,如下所示:

[12, 32, 657, 1, 67, ...].forEach((id) => {
    axios.get(`myapi.com/user/${id}`).then(({ data }) => {
        console.log(data.name);
    });
});

但是,我有很多请求要发出,我无法让它们异步,因为我的计算机有限制...是否可以等待每个请求完成后再发出下一个请求?

【问题讨论】:

    标签: javascript api asynchronous axios


    【解决方案1】:

    不要在 id 中使用forEach 尝试Promise.all

    const ids = [12, 32, 657, 1, 67];
    const promises = ids.map((id) => axios.get(`myapi.com/user/${id}`));
    
    Promise.all([...promises]).then(function (values) {
      console.log(values);
    });
    

    假设我们希望多个 Promise 并行执行并等到 都准备好了。

    例如,并行下载多个 URL 并处理 全部完成后的内容。

    来自https://javascript.info/promise-api

    【讨论】:

      【解决方案2】:

      首先,很明显你必须重新设计你的 api。

      不过,你可以试试:

      
      Promise.all([12, 32, 657, 1, 67, ...].map((id) => {
          return axios.get(`myapi.com/user/${id}`).then(({ data }) => {
              console.log(data.name);
          });
      })).then(_=>console.log('done'));
      
      

      或查看p-queue,这将帮助您管理承诺队列。

      【讨论】:

        【解决方案3】:

        假设您允许n 请求在任何给定时间最多发送。为了这个例子,我假设它是 10:

        var n = 10;
        

        我们还存储当前索引:

        var index = 0;
        

        让我们实现一个函数来处理请求:

        function req() {
            axios.get(`myapi.com/user/${input[index]}`).then(({ data }) => {
                console.log(data.name);
                if (index + 1 < input.length) {
                    index++;
                    req();
                }
            });    
        }
        

        然后,让我们发送第一个n 请求:

        while (index < n) {req(); index++}
        

        是的,index 是全局的,但为了便于阅读,它是全局的。

        【讨论】:

        • 感谢您的回答。但是我认为我可以进行最大数量的递归是否正确?我有大约 500 000 个电话要打。
        • @tomfl 你有一个非常特殊的情况,这可能是那些实现你的浏览器的人没有计划好的。我鼓励您尝试使用虚拟函数,而不是实际发送请求,而是在 50 毫秒内执行 setTimeout 并保持想法的其他部分不变。那应该回答你的担忧。请告诉我结果,我也对此感兴趣。
        • 如果递归没有通过调用 setTimeout 而不是发送请求来破坏系统,那么它是准证明你不会遇到递归问题。如果递归破坏了系统,那么您也可以通过 setInterval 轮询状态并为您的请求管理一个槽系统。或者,您始终可以拥有 n 个元素的数据包并等待请求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 2017-02-16
        • 2019-12-24
        相关资源
        最近更新 更多