javascript - 并行运行多个 Axios 请求以验证数据
问题描述
我正在使用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
)不感兴趣(返回错误消息)。
解决方案
首先要看的是,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
}
编辑:我添加了一个 try/catch 块来匹配 OP。
推荐阅读
- spring-data-jpa - Spring boot jpa事务无法插入异常
- html - 如何添加 Twitch 嵌入式视频作为媒体查询以适应 48em 窗口?
- google-apps-script - 当用户在 google sheet 中插入行并返回新创建的行号列表时触发
- javascript - 填充帖子 MongoDB 的评论部分
- postgresql - 使用 copy from 命令将数据从 csv 加载到 postgres
- javascript - hilios javascript倒计时完成后不会触发回调
- tensorflow2.0 - 如何使用训练有素的模型预测 Cupy 数组?
- flutter - Flutter const 与 const 构造函数
- python - 如何按最长到最短对字典进行排序
- phaser-framework - 无法从 facebook 即时游戏包中加载资产