Délai d'attente dans async/await
Je suis avec Node.js et Tapuscrits et je suis en utilisant async/await
.
C'est mon cas de test:
async function doSomethingInSeries() {
const res1 = await callApi();
const res2 = await persistInDB(res1);
const res3 = await doHeavyComputation(res1);
return 'simle';
}
Je voudrais définir un délai d'attente pour l'ensemble de la fonction. I. e. si res1
prend 2 secondes, res2
prend 0,5 secondes, res3
prend que 5 secondes j'aimerais avoir un délai d'attente qu'au bout de 3 secondes, permettez-moi de jeter une erreur.
Normale avec une setTimeout
appel est un problème parce que la portée est perdu:
async function doSomethingInSeries() {
const timerId = setTimeout(function() {
throw new Error('timeout');
});
const res1 = await callApi();
const res2 = await persistInDB(res1);
const res3 = await doHeavyComputation(res1);
clearTimeout(timerId);
return 'simle';
}
Et je ne peux pas l'attraper à la normale Promise.catch
:
doSomethingInSeries().catch(function(err) {
//errors in res1, res2, res3 will be catched here
//but the setTimeout thing is not!!
});
Toutes les idées sur la façon de résoudre?
Êtes-vous à l'aide d'une promesse spécifique de la bibliothèque?
Non, juste la norme promesse.
Donc 2 + 0.5 + 5 + 3 rend un délai d'attente de 11,5 secondes?
Non, juste la norme promesse.
Donc 2 + 0.5 + 5 + 3 rend un délai d'attente de 11,5 secondes?
OriginalL'auteur nkint | 2016-05-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
Promesse.course
de faire un timeout:Vous ne pouvez pas utiliser
setTimeout
sans l'enveloppant dans une promesse.Pourquoi ne pas avoir besoin de
clearTiimeout
?Nous n'avons pas besoin de l'effacer parce que le refus n'est pas considérée comme quand
doSomethingInSeries()
s'installe d'abord. Nous avons pu l'effacer, mais qui serait plutôt compliqué (de façon optimalerace
aurait un moyen d'annuler le ralentissement de promesses, mais ce n'est pas possible avec les autochtones de promesses).Peut-être que j'ai un problème dans les tests async des trucs, mais me semble que même si
race
rejette, doSomethingInSeries continuer à avancer ses propres aliments. Comment être sûr de s'arrêter tout à l'intérieur dedoSomethingInSeries
, si le délai d'rejette?Vous ne pouvez pas arrêter une promesse, il ne représente qu'une suite (avertissement: si vous utilisez une promesse de mise en œuvre qui prend en charge l'annulation). Donc, si il ya quelque chose que vous devez faire sur le cours des choses, vous devrez le faire manuellement (de la même manière que vous avez fait avec
clearTimeout
dans votre réponse ci-dessous).OriginalL'auteur Bergi
Ok j'ai trouvé cette façon:
Personne erreurs?
Les choses qui sent un peu à moi, c'est qu'à l'aide de Promesses que l'asynchronicité stratégie va nous envoyer à allouer trop d'objets qu'une autre stratégie, mais c'est hors-sujet.
_doSomethingInSeries()
échoue. Vous devez utilisertry { return await Promise.race(…); } finally { clearTimeout(timeoutId); }
OriginalL'auteur nkint