idl*_*erg 1 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;
}
Run Code Online (Sandbox Code Playgroud)
虽然这一切都按预期工作,但迭代一系列包并调用axios.get()每个项目似乎非常低效.有没有办法并行运行这些并在其中一个请求失败后中断?
同样,我对项目的实际数据不感兴趣,只是它是否存在(等于true)(返回错误消息).
首先要看的是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
}
Run Code Online (Sandbox Code Playgroud)
编辑:我添加了一个try/catch块来匹配OP.