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

Promise

new Promise(executor)

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

Исполнитель

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

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

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

Promise.all ()

Promise.all () возвращает одно Promise, которое разрешается, когда все Promise переданы как итерируемые.
Теперь передаем массив запросов в Promise.all ().

Promise.all(requests)

Promise.all () возвращает Promise при передаче с итерируемым объектом, содержащим Promise. Возвращенное Promise затем разрешается / отклоняется асинхронно.

1. Итерация

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

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

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

2. Код, который будет выполнен

Promise, и Promise.all (), выполняется асинхронно, когда все Promise в данной итерации разрешены.

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: <API url>+‘?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))

Ответить