Promise.all () и параллельные обещания, они отличаются в узле - PullRequest
0 голосов
/ 11 октября 2018

У меня есть сценарий, в котором я могу реализовать свой код для выполнения аксиос запросов двумя способами

1-й способ

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);

2-й путь

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);
  }

Какой подход лучше?и почему?

Я предпочитаю 1-й подход, потому что у меня могут быть хорошо структурированные данные, чем полный массив результатов.Но получил предложение реализовать последовательно, а не параллельно

Я предполагаю, что узел является однопоточным, поэтому не нашел никакой разницы в его реализации (я могу ошибаться, если использую async и await)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Утверждение «Javascript является однопоточным» часто вводит людей в заблуждение.

Хотя основной поток выполнения кода является однопоточным, асинхронные выполнения обычно не обрабатываются основным потоком.Таким образом, в основном, когда вы выполняете несколько асинхронных задач последовательно или параллельно, параллельное выполнение наверняка будет быстрее.

Мы иногда используем подход асинхронного ожидания, если нам нужно обернуть несколько зависимых асинхронных операций в однуобещаю.Независимые асинхронные операции должны выполняться параллельно.

0 голосов
/ 11 октября 2018

Второй подход будет более производительным.

В первом примере предположим, что для возврата каждого запроса требуется 1 секунда, поэтому вам потребуется не менее 3 + секунд, чтобы вернуть результаты, пока вы ждете результата одного запроса, прежде чем делать следующий.

Во втором подходе вы делаете все запросы одновременно, а затем ждете обратного вызова IO.После обработки всех запросов Promise.all() разрешится.Если каждый запрос занимает ~ 1 секунду, но выполняется параллельно, ваш ответ также будет составлять около 1 секунды.

Я бы использовал синтаксис, подобный следующему, однако для поддержания читабельности, как вы, кажется, используете async/await и donне нужно иметь ссылку на 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...