Рубрики
Без рубрики

JavaScript: Как сделать API звонить для каждого значения в массиве и получить массив результатов.

Сегодня мне пришлось позвонить API для кучка идентификаторов и получить результаты для каждого из этих идентификаторов. Теперь проблема в том, что мне нужно собрать результаты из всех этих вызовов API. И я не хотел использовать простые старые для петли для этого сегодня.

Автор оригинала: Aditi Tipnis.

Сегодня мне пришлось позвонить API для кучка идентификаторов и получить результаты для каждого из этих идентификаторов. Теперь проблема в том, что мне нужно собрать результаты из всех этих вызовов API. И я не хотел использовать простые старые для петли для этого сегодня.

Так вот как я это сделал. (Перейти к концу полного кода)

Обещать

new Promise(executor)

Объект обещания представляет собой возможное завершение (или неудачу) асинхронной операции и ее результирующее значение.

Исполнитель

Функция, которая передается аргументами, разрешается и отклоняет. Исполнитель обычно инициирует некоторую асинхронную работу, а затем, как только что завершит, либо вызывает функцию разрешения для решения обещания, либо отклоняют его, если произошла ошибка.

let requests = ids.map(id => {
   return new Promise((resolve, reject) => {
      request({
      uri: +'?id=' + id,
      method: 'GET'
      })
   })
})

Итак, теперь каждый из наших вызовов API завернут обещание. Это означает, что запросы теперь являются итеративными обещаниями.

Обещание. Все ()

Обещание. Все () возвращает одно обещание, которое решает, когда все обещания прошли как утеряемое. Теперь мы проходим массив запросов к обещанию. Все ().

Promise.all(requests)

Теперь биты и кусочки готовы. Но я еще не подключил этих двух частей.

PROUTIONS.ALL () возвращает ожидающие обещания при прохождении с утечкой, содержащими обещания. Это возвращенное обещание затем разрешено/отклонено асинхронно (как только стек пуст), когда все обещания в заданном утечлении были решены, или если какие-либо обещания отклоняют. Так что значит, что должно быть

  1. Способ разрешить каждую из обещаний в потенциальном
  2. Код должен быть выполнен, когда обещание вернулось по обещанию. Все () решил

1. способ разрешить каждую из обещаний в потенциальном

Исполнитель обычно инициирует некоторую асинхронную работу, а затем, как только что завершит, либо вызывает функцию разрешения для решения обещания, либо отклоняют его, если произошла ошибка. Запрос принимает обратный вызов, который вызывается, когда вызов API вернулся. В этом обратном вызове мы сначала проверим ошибку. Если ошибки нет, мы вызываем функцию RESOLVE, передаваемой в функцию исполнителя, используемой для создания обещания. Точно так же, в случае ошибки, мы называем функцию отклонения.

let requests = ids.map(id => {
return new Promise((resolve, reject) => {
      request({
            uri: +'?id=' + id,
            method: 'GET'
            })
         },
         (err, res, body) => {
            if (err) { reject(err) }
            resolve(body)
         })
      )
})

2. Код, который должен быть выполнен, когда обещание возвращается по обещанию. Все () решил

Обещание, вернуемое по обещанию. Все () разрешено/отклонено асинхронно (как только стек пуст), когда все обещания в заданном утечке разрешили

Promise.all(requests)
.then(body => { 
   body.forEach(res => {
   if (res)
      productsToReturn.push(JSON.parse(res).productInfo)
   })
})

Здесь мы получаем ответы, полученные от каждого из наших вызовов API в массиве. Мы манипулируем каждым из ответов в соответствии с нашими требованиями и подтолкните его в массив.

Вот полный код

var productsToReturn = []
let requests = ids.map(id => {
   //create a promise for each API call
   return new Promise((resolve, reject) => {
      request({
         uri: +'?id=' + id,
         method: 'GET'
      },
      (err, res, body) => {
      if (err) { reject(err) }
      //call the resolve function which is passed to the executor                             //function passed to the promise
      resolve(body)
      })
   })
})
Promise.all(requests).then((body) => { 
//this gets called when all the promises have resolved/rejected.
   body.forEach(res => {
   if (res)
      productsToReturn.push(JSON.parse(res).productInfo)
   })
}).catch(err => console.log(err))