【问题标题】:Running several Axios requests in parallel to validate data并行运行多个 Axios 请求以验证数据
【发布时间】:2019-02-06 15:47:03
【问题描述】:

我正在使用Inquirer.js 与用户进行交互。在其中一个对话框中,用户可以指定以逗号分隔的“项目”列表。以下验证函数会根据 API 检查“项目”是否可用。如果没有,系统会提示用户更正他之前的选择。

当前代码:

validate: async str => {    
  const items = str.split(',');    

  for(let item of items) {
    try {
      await axios.get(`https://api.example.com/items/${item}`);
    } catch(e) {
      return `The item '${item}' could not be found`;
    }
  }   

  // data exists, but is irrelevant
  return true;
}

虽然这一切都可以正常工作,但遍历一组包并在每个项目上调用axios.get() 似乎效率非常低。有没有办法并行运行这些并在其中一个请求失败时中断?

同样,我对项目的实际数据不感兴趣,只关心它是否存在(等于 true)(返回错误消息)。

【问题讨论】:

  • 你试过 Promise.all(),并给每个 axios 请求一个自己的 catch 块,这样一个失败就不会失败另一个承诺?

标签: javascript node.js axios inquirerjs


【解决方案1】:

首先要看的是,JavaScript 不能真正以传统意义上的“并行”运行事物,因为它不是多线程环境。

但是,您可以在一个块中发送所有 API 调用,然后一起等待响应,而不是在发送下一个之前等待每个响应。这可以使用 Promise API 的Promise.all 来完成,见下文:

var promises = [];
for(let item of items) {
    promises.push(axios.get(`https://api.example.com/items/${item}`));
}
try {
    var responses = await Promise.all(promises); // responses will be an array
} catch (err) {
    // do something with error
}

And here the Promise.all docs

编辑:我添加了一个 try/catch 块来匹配 OP。

【讨论】:

  • 是的,只是补充一下,因为 promise.all 是“快速失败”,它符合 OP 的要求。
  • 我们需要在.all()之后使用.then()吗?
  • @midnightnoir 不,await 关键字替换了 .then() 语法。在 Javascript 中查找 await/async 代码以了解有关如何使用 await 的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 2020-10-19
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多