我有一个方案,可以实现我的代码以两种方式发出axios请求
const data = {};
try {
if (searchArray.includes('address')) {
const address = await axios('./getAddress')
data.addresses = address.data;
}
if (searchArray.includes('email')) {
const email = await axios('./email')
data.emails = email.data;
}
if (searchArray.includes('phone')) {
const phoneNumber = await axios('./phone')
data.phoneNumbers = phoneNumber.data;
}
} catch (err) {
return res.status(constants.HTTP_SERVER_ERROR).json(err);
}
res.status(200).json(data);
const data = {};
const promises = []
if (searchArray.includes('address')) {
promises.push(axios('./getAddress'))
}
if (searchArray.includes('email')) {
promises.push(axios('./email'))
}
if (searchArray.includes('phone')) {
promises.push(axios('./phone'))
}
Promise.all(promises)
.then(results => {
res.status(200).json(results);
})
.catch(err) {
return res.status(constants.HTTP_SERVER_ERROR).json(err);
}
哪种方法更好?为什么?
我更喜欢第一种方法,因为与完整的结果数组相比,我可以拥有结构良好的数据。但是有建议要比并行实现
我认为节点是单线程的,因此在实现它时没有发现任何区别(如果我使用async和await,我可能是错的)
答案 0 :(得分:3)
第二种方法将表现得更好。
在第一个示例中,假设每个请求都需要1秒才能返回,因此在等待下一个请求的结果之前,您将至少花费3+秒的时间来返回结果。
在第二种方法中,您一次发出所有请求,然后等待IO回调。处理完所有请求后,Promise.all()
将解决。如果每个请求大约需要1秒钟,但同时进行,则您的响应也将约为1秒。
我将使用以下语法,但是为了保持可读性,因为您似乎正在使用async/await
,并且不需要引用promises
。
try {
const [addresses, emails, phones] = await Promise.all([
searchArray.includes('address')
? axios('./getAddress') : Promise.resolve({}),
searchArray.includes('email')
? axios('./email') : Promise.resolve({}),
searchArray.includes('phone')
? axios('./phone') : Promise.resolve({}),
]);
return res.status(200).json({
addresses: addresses.data,
emails: emails.data,
phoneNumbers: phones.data,
});
} catch (err) {
return res.status(constants.HTTP_SERVER_ERROR).json(err);
}
答案 1 :(得分:3)
“ Javascript是单线程”这样的语句经常使人们感到困惑。
虽然代码执行的主线程是单线程,但异步执行通常不由主线程处理。因此,基本上,当您在串行与并行中执行少量异步任务时,并行执行肯定会更快。
有时我们需要异步等待方法,如果我们需要将多个相关的异步操作包装在一个promise中。独立的异步操作应并行执行。