【问题标题】:Axios requests in parallelaxios 请求并行
【发布时间】:2019-07-16 22:15:12
【问题描述】:

几天前我有一个问题,假设我们有以下 3 个承诺:

let promise1 = axios.get(URL1);
let promise2 = axios.get(URL2);
let promise3 = axios.get(URL3);

它们将异步执行并返回带有.then() 的数据,假设每个这些 GET 请求需要 1.00 秒。

这个请求的总执行时间需要 3 秒,对吧?有什么方法可以并行执行这些请求,以便我们在 1 秒内获得 3 个请求的数据?还是因为单线程语言不可能?

谢谢。

【问题讨论】:

  • 如果您等待每次执行完成,您只会得到 3 秒...使用 Promise.all() 并行运行它们
  • 我认为最简单的方法是使用 async/await,谷歌它我不太确定该怎么做,但我相信它可能
  • 显示的请求是并行进行的。承诺的创建是相对即时的

标签: javascript node.js axios


【解决方案1】:

截至May 27, 2020,您应该使用Promise.all

Promise.all([axios.get(URL1), axios.get(URL2), axios.get(URL3)])
    .then((responses) => {
        const [url1rest, url2resp, url3resp] = responses;
        // do something
    });

现已弃用:您可以将axios.allaxios.spread 结合使用:

axios.all([axios.get(URL1), axios.get(URL2), axios.get(URL3)])
     .then(axios.spread(url1resp, url2resp, url3resp) {
          // do something
     });

【讨论】:

  • 理论上这需要 1 秒来完成 3 个请求?
  • 它同时运行它们,所以是的,如果每个请求需要一秒钟,那么整个事情应该只需要一秒钟。
  • axios 文档说 .all() 已被弃用,并要求直接指向 Promise.all (github.com/axios/axios#concurrency-deprecated)
【解决方案2】:

您拥有的代码并行执行它们。这就是异步函数的意义所在。

虽然 JavaScript 在单个事件循环上运行(除非您使用 Workers),但异步代码不受该循环的约束。这就是代码首先是异步的原因。

发出 HTTP 请求的责任被移交给事件循环之外的代码。这意味着它可以并行执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2020-02-14
    • 2020-06-21
    • 2017-06-06
    相关资源
    最近更新 更多