2

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

4

1 回答 1

7

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

这里是Promise.all文档

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

于 2018-08-31T15:17:03.220 回答