Comment puis-je ajouter un setTimeout à mon appel de fonction d'attente asynchrone?
J'ai
request = await getProduct(productids[i]);
où
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!
}
};
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.
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.