Promise.all()和并行promise在节点上有所不同

时间:2018-10-11 19:05:29

标签: node.js axios

我有一个方案,可以实现我的代码以两种方式发出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,我可能是错的)

2 个答案:

答案 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中。独立的异步操作应并行执行。