web-dev-qa-db-fra.com

Comment définir TimeTime sur un nœud d'appel en attente asynchrone

Comment puis-je ajouter un setTimeout à mon appel de fonction d'attente asynchrone?

J'ai

    request = await getProduct(productids[i]);

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

J'ai essayé

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

et a obtenu l'erreur TypeError: "callback" argument must be a function ce qui est logique. La demande est à l'intérieur d'une boucle qui me fait atteindre la limite de débit sur un appel 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!
  }
};
5
jenryb

Vous pouvez utiliser une petite fonction simple qui renvoie une promesse qui se résout après un délai:

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

Et puis await que dans votre boucle:

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

Remarque: J'ai également changé votre boucle for pour utiliser for/of ce qui n'est pas obligatoire, mais qui est un peu plus propre que ce que vous aviez.

7
jfriend00

En fait, j'ai un morceau de code assez standard que j'utilise pour cela:

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

Usage:

await PromiseTimeout(1000);

Si vous utilisez des promesses Bluebird, il est intégré sous la forme Promise.timeout .

Plus à votre problème: avez-vous vérifié les documents de l'API? Certaines API vous indiquent combien vous devez attendre avant la prochaine demande. Ou autorisez le téléchargement de données en masse.

2
Giulio Bambini