运行 多个 Axios 请求并行验证数据
Running several Axios requests in parallel to validate data
我正在使用 Inquirer.js 与用户互动。在其中一个对话框中,用户可以指定 "items" 的逗号分隔列表。以下验证函数检查 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
)或不存在(returns 一条错误消息)。
首先要看的是JavaScript不能真正运行传统意义上"parallel"的东西,因为它不是多线程环境
但是,您可以在一个块中发送所有 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。
我正在使用 Inquirer.js 与用户互动。在其中一个对话框中,用户可以指定 "items" 的逗号分隔列表。以下验证函数检查 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
)或不存在(returns 一条错误消息)。
首先要看的是JavaScript不能真正运行传统意义上"parallel"的东西,因为它不是多线程环境
但是,您可以在一个块中发送所有 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。