Ждите ответа внутри цикла - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть код ниже, который делает сторонний вызов API, используя request npm

const array = []
for (var i = 0; i < 10; i++) {
  request('api_call', function(err, res) {
    array.push(res)
  })
}
console.log(array)

Но в массиве ничего не получено.

Может кто-нибудь помочь, пожалуйста, как мне подождать все 10 вызовов API?

1 Ответ

0 голосов
/ 16 ноября 2018

request() неблокируемый и асинхронный.Таким образом, ваш for цикл завершается до того, как ЛЮБОЙ из ваших request() вызовов завершится.Есть много способов сделать это, но лучший из известных мне способов - это использовать обещания, а Promise.all():

const rp = require('request-promise');
const promises = [];

for (var i = 0; i < 10; i++) {
  promises.push(rp('api_call'));
}
Promise.all(promises).then(results => {
   console.log(results);
}).catch(err => {
   console.log(err);
});

запрос-обещание - это обещанная версия библиотеки запросов (возвращает обещание вместоиспользуя простой обратный вызов).Этот код накапливает обещания в массив, а затем использует Promise.all(), чтобы сообщить нам, когда все обещания разрешены (например, все запросы выполнены).Результаты затем представляются нам в порядке в массиве results.

Этот метод запускает все ваши запросы параллельно.


Если вы хотите выполнять их последовательно, а не параллельно, вы можете использовать async/await, чтобы сделать цикл forперед каждым продолжением сделайте паузу для каждого результата.

const rp = require('request-promise');

async function myFunc() {
    const results = [];
    for (let i = 0; i < 10; i++) {
        let r = await rp('api_call');
        results.push(r);
    }
    return results;
}


myFunc().then(results => {
   console.log(results);
}).catch(err => {
   console.log(err);
});

Если вы на самом деле не просто отправляете один и тот же запрос 10 раз, а фактически выполняете итерацию массива для выполнения вызовов 10 API, то вы, вероятно, будете использовать .map() или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...