并行运行多个Axios请求以验证数据

时间:2018-08-31 15:10:28

标签: javascript node.js axios inquirerjs

我正在使用Inquirer.js与用户互动。在其中一个对话框中,用户可以指定以逗号分隔的“项目”列表。以下验证功能针对API检查“ item”是否可用。如果不是,则提示用户对其先前的选择进行更正。

当前代码:

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)(返回错误消息)不感兴趣。

1 个答案:

答案 0 :(得分:5)

首先要看的是,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。