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()
или что-то в этом роде.