Как установить время на асинхронном узле ожидания - PullRequest
0 голосов
/ 30 апреля 2018

Как я могу добавить setTimeout к моему вызову асинхронного ожидания?

У меня есть

    request = await getProduct(productids[i]);

, где

const getProduct = async productid => {
        return requestPromise(url + productid);
   };

Я пробовал

    request = await setTimeout((getProduct(productids[i])), 5000);

и получил ошибку TypeError: "callback" argument must be a function, которая имеет смысл. Запрос находится внутри цикла, который заставляет меня достигнуть ограничения скорости при вызове API.

exports.getProducts = async (req, res) => {
  let request;
  for (let i = 0; i <= productids.length - 1; i++) {
    request = await getProduct(productids[i]);
    //I want to wait 5 seconds before making another call in this loop!
  }
};

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать простую маленькую функцию, которая возвращает обещание, которое разрешается после задержки:

function delay(t, val) {
   return new Promise(function(resolve) {
       setTimeout(function() {
           resolve(val);
       }, t);
   });
}

И затем await, что внутри вашего цикла:

exports.getProducts = async (req, res) => {
  let request;
  for (let id of productids) {
    request = await getProduct(id);
    await delay(5000);
  }
};

Примечание: я также переключил ваш цикл for на for/of, который не требуется, но немного чище, чем у вас.

0 голосов
/ 30 апреля 2018

На самом деле, у меня есть довольно стандартный кусок кода, который я использую для этого:

function PromiseTimeout(delayms) {
    return new Promise(function (resolve, reject) {
        setTimeout(resolve, delayms);
    });
}

Использование:

await PromiseTimeout(1000);

Если вы используете обещания Bluebird, то он встроен как Promise.timeout.

Еще к вашей проблеме: вы проверили документы API? Некоторые API сообщают вам, сколько вам придется ждать до следующего запроса. Или разрешить загрузку данных большими партиями.

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