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