javascript - 一次下载两个 URL,但一个完成后立即处理

标签 javascript concurrency axios

我有两个 API 网址要访问。已知速度很快(约 50-100 毫秒)。已知速度较慢(约 1 秒)。我使用这些结果向用户显示产品选择。目前我正在等待下载一个,然后下载第二个。非常同步,因此它为已经很慢的第二次点击增加了 50-100 毫秒。

我愿意:

  • 同时发送两个请求
  • 一有请求返回就开始处理数据
  • 等待这两个请求,然后再继续。

我看过 Axios 给出的示例...

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));

但是这似乎要等待两个 URL 都提交。这仍然会稍微快一些,但我希望 50 毫秒 API 命中的数据在准备就绪后立即开始显示。

最佳答案

当然,您可以将附加的 .then 链接到 axios 返回的 promise :

  Promise.all([
    getUserAccount()
      .then(processAccount),
    getUserPermissions()
      .then(processPermissions)
  ]).then(([userAccount, permissions]) => {
     //...
  });

我们的processAccountprocessPermissions是将axios响应对象作为参数并返回想要的结果的函数。

当然,您也可以将多个 .then 添加到同一个 Promise:

  const account = getUserAccount();
  const permissions = getUserPermissions();

  // Show permissions when ready
  permissions.then(processPermissions);

  Promise.all([account, permissions])
  .then(([account, permissions]) => {
     // Do stuff when both are ready
  });
<小时/>

我用 Promise.all 替换了 axios.all - 我不知道为什么 axios 提供了这个帮助器,因为 JS 有一个 native 实现。我尝试查阅文档...但他们甚至没有记录该 API。

关于javascript - 一次下载两个 URL,但一个完成后立即处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154265/

相关文章:

javascript - 使用区分大小写的替换搜索不区分大小写

javascript - 如何在 Ext JS ItemSelector/Multiselect 控件中设置图例?

javascript - Mocha 如何知道在测试套件中首先加载哪个文件

javascript - 为什么使用 Switch 时需要 Break?

redux - 如何使用 URL 中的路由参数执行 axios get 请求?

javascript - igdb.com API | React Axios 请求被 CORS 策略阻止;请求的资源上不存在 'Access-Control-Allow-Origin' header

javascript - Axios: config.method.toLowerCase 不是函数

concurrency - Rust 异步等待 : check if any future in a list resolves to true concurrently?

java - 关于ConcurrentHashMap,下面是什么意思?

google-apps-script - 谷歌应用程序脚本中的同时执行限制