Задание задержки / тайм-аута для запросов axios в функции map () - PullRequest
1 голос
/ 12 июля 2019

Я использую node и axios (с TS, но это не так важно) для запроса API.У меня есть набор сценариев, которые делают вызовы к различным конечным точкам и регистрируют данные (иногда их фильтруют). Эти сценарии используются для целей отладки.Я пытаюсь сделать эти сценарии «лучше», добавив задержку между запросами, чтобы я не «взорвал» API, особенно когда у меня большой массив, который я пытаюсь передать.Поэтому в основном я хочу сделать запрос GET и сделать паузу на определенное время, прежде чем делать следующий запрос.

Я играл с функциями setTimeout(), но я помещаю их только там, гдеони добавляют задержку после выполнения запросов;везде, где я вставил функцию, этот результат был.Я понимаю, почему я получаю этот результат, мне просто нужно было сделать все возможное, чтобы хотя бы улучшить свое понимание того, как все работает.

Хотя у меня есть попытка настроить очередь или использовать перехватчики, но я думаю, что я могу «отклониться» от более простого решения с этими идеями.

Кроме того, у меня естьдругой «базовый сценарий», который я написал на лету (вроде точки рождения для этой серии сценариев), который я создал с помощью цикла for вместо функций map() и promise.all.Я также пытался установить задержку в этом скрипте, но мне ничего не помогло.

var axios = require('axios');
var fs = require('fs');

const Ids = [arrayOfIds];

try {
    // Promise All takes an array of promises
   Promise.all(Ids.map(id => {
        // Return each request as its individual promise
        return axios 
          .get(URL + 'endPoint/' + id, config)
    }))

    .then((vals) =>{
        // Vals is the array of data from the resolved promise all
        fs.appendFileSync(`${__dirname}/*responseOutput.txt`, 
vals.map((v) => {
            return `${JSON.stringify(v.data)} \n \r`
        }).toString())
    }).catch((e) => console.log)
} catch (err) {
  console.log(err);
}

Нет ошибок с приведенным выше кодом;просто не могу понять, как правильно выставить задержку.

1 Ответ

0 голосов
/ 12 июля 2019

Вы можете попробовать Promise.map из bluebird

Имеется опция настройки concurrency

var axios = require('axios');
var fs = require('fs');
var Promise = require('bluebird');

const Ids = [arrayOfIds];

let concurrency = 3;  // only maximum 3 HTTP request will run concurrently

try {

    Promise.map(Ids, id => {

        console.log(`starting request`, id);

        return axios.get(URL + 'endPoint/' + id, config)

    }, { concurrency })

    .then(vals => {
        console.log({vals});
    })
    ;

} catch (err) {
  console.log(err);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...