Выполнение нескольких запросов Axios параллельно для проверки данных - PullRequest
0 голосов
/ 31 августа 2018

Я использую 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) или нет (возвращает сообщение об ошибке).

1 Ответ

0 голосов
/ 31 августа 2018

Первое, на что нужно обратить внимание, - это то, что JavaScript не может на самом деле запускать вещи «параллельно» в традиционном смысле, потому что это не многопоточная среда.

Тем не менее, вы можете отправить все вызовы API в одном блоке, а затем ждать ответы вместе вместо того, чтобы ждать каждого перед отправкой следующего. Это можно сделать с помощью API Promise 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
}

А здесь Promise.all документы

edit: я добавил блок try / catch, чтобы соответствовать OP.

...