Как отложить вызовы API в цикле, чтобы предотвратить дросселирование от AWS - PullRequest
0 голосов
/ 27 июня 2018

с использованием javascript SDK, который предоставляет aws.

У меня есть цикл, который выполняется каждые 16 секунд, в этом цикле я получаю состояние каждого имеющегося у меня конвейера, который соответствует примерно 20 конвейерам и 20 вызовам API.

Моя проблема в том, что когда этот цикл выполняется, я иногда получаю некоторые ошибки регулирования от AWS в некоторых штатах, которые я пытаюсь получить.

Мне нужно кое-как добавить задержку в 1 или 2 секунды перед каждым вызовом getPipelineState, чтобы я не встречался с ошибками регулирования

ниже код

this.interval = setInterval(async function () {

                await Promise.all(pipelines.map(async pipeline => {
                    let params = {name: pipeline};
                    let data = await codepipeline.getPipelineState(params).promise();


                     // do stuff with response
                     //some sort of delay before the next pipelines state is fetched

                 }));

            }, 16000);

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Создайте новую функцию задержки, которая возвращает обещание, которое разрешается через X миллисекунд. Тогда просто подожди, вот пример.

this.interval = setInterval(async function() {

  await Promise.all(pipelines.map(async pipeline => {
    let params = {
      name: pipeline
    };
    let data = await codepipeline.getPipelineState(params).promise();


    // do stuff with response
    
    /* my addition */
    await delay(1000);
    
    //some sort of delay before the next pipelines state is fetched
    
  }));

}, 16000);


/* My additional function  */
function delay(milli) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, milli);
  });
}
0 голосов
/ 27 июня 2018

Вы можете либо вызвать функцию асинхронной карты с индексом, и ожидать sleep (index * 2000) внутри или цепочку обещаний через массив следующим образом:

this.interval = setInterval(async function () {

    await pipelines.reduce((promise, pipeline) => {
      return promise.then(() => {
        return codepipeline.getPipelineState({
          name: pipeline
        }).promise();
      });
    }, Promise.resolve());

}, 16000);
...