NodeJS Délai d'attente d'une Promesse si n'a pas pu terminer dans le temps
Comment puis-je le délai d'attente d'une promesse après un certain laps de temps?
Je sais Q a une promesse de délai d'attente, mais je suis en utilisant le natif de NodeJS promesses, et ils n'ont pas .fonction de délai.
Ai-je raté une ou emballés différemment?
Sinon, Est au-dessous de la mise en œuvre de bonnes dans les moyens de ne pas sucer de la mémoire, qui travaille en fait comme prévu?
Aussi je peux faire c'est en quelque sorte enveloppé à l'échelle mondiale afin que je puisse l'utiliser pour toutes les promesses que j'ai créer, sans avoir à répéter le setTimeout et clearTimeout code?
function run() {
logger.info('DoNothingController working on process id {0}...'.format(process.pid));
myPromise(4000)
.then(function() {
logger.info('Successful!');
})
.catch(function(error) {
logger.error('Failed! ' + error);
});
}
function myPromise(ms) {
return new Promise(function(resolve, reject) {
var hasValueReturned;
var promiseTimeout = setTimeout(function() {
if (!hasValueReturned) {
reject('Promise timed out after ' + ms + ' ms');
}
}, ms);
//Do something, for example for testing purposes
setTimeout(function() {
resolve();
clearTimeout(promiseTimeout);
}, ms - 2000);
});
}
Merci!
Vous devez vous connecter pour publier un commentaire.
JavaScript natif promesses n'ont pas de mécanisme d'expiration.
La question au sujet de votre mise en œuvre serait probablement un meilleur ajustement pour http://codereview.stackexchange.com, mais un couple de notes:
Vous ne fournissez pas un moyen de réellement faire quelque chose dans la promesse, et
Il n'y a pas besoin de
clearTimeout
au sein de votresetTimeout
rappel, depuissetTimeout
les horaires d'une minuterie.Depuis une promesse ne peut pas être résolu, rejetée une fois qu'il a été résolu, rejetée, vous n'avez pas besoin de vérifier.
Donc peut-être quelque chose le long de ces lignes:
Utilisée comme ceci:
(Ou vous peut voulez qu'il soit un peu plus compliqué, voir mise à jour sous la ligne ci-dessous.)
Je serais un peu préoccupé par le fait que la sémantique sont légèrement différents (pas de
new
, alors que vous ne l'utiliseznew
avec lePromise
constructeur), de sorte que vous pouvez ajuster qui.L'autre problème, bien sûr, est que la plupart du temps, vous ne voulez pas construire de nouvelles promesses, et donc ne pourrait pas utiliser les ci-dessus. La plupart du temps, vous avez une promesse déjà (à la suite d'une précédente
then
appel, etc.). Mais pour les situations où vous êtes vraiment à la construction d'une nouvelle promesse, vous pouvez utiliser quelque chose comme ci-dessus.Vous pouvez traiter avec le
new
chose par sous-classementPromise
:Utilisation:
Live Exemple:
JS:
HTML:
À la fois de ceux qui vont appeler
reject
lorsque le délai expire, même si le rappel appelleresolve
oureject
premier. C'est très bien, une promesse de partage de l'état ne peut pas être modifiée une fois qu'elle est, et la spécification définit les appels àresolve
oureject
sur une promesse qui est déjà réglés comme des faire-riens qui ne soulèvent pas une erreur.Mais si cela vous dérange, vous pouvez envelopper
resolve
etreject
. VoicimyPromise
fait de cette façon:Vous pouvez tourner que sur 18 façons différentes, mais le concept de base est que le
resolve
etreject
nous passons la promesse exécuteur nous recevons sont des wrappers qui claire de la minuterie.Mais, qui crée les fonctions et les fonctions supplémentaires des appels que vous n'avez pas besoin. La spécification est clair sujet de ce que la résolution des fonctions ne lorsque la promesse est déjà résolu; ils ont quitté très tôt.
new Promise(...)
avecmyPromise(timeout, ...)
. J'ai ajouté un peu de la réponse.reject
. Bien que la promesse de l'état ne peut pas être changé une fois réglé, le fait quereject
est toujours appelée semble un gaspillage de moi. Toutes les suggestions?Alors que peut-être il n'y a pas de support pour une promesse de délai d'expiration, vous pourriez course promet:
JS:
Un générique
Promise.timeout
:Exemple:
JS:
Peut-être un peu cher, parce que vous êtes réellement la création de 3 promesses au lieu de 2. Je pense que c'est plus clair de cette façon, si.
Vous pourriez voulez configurer une promesse au lieu d'avoir la construction de la fonction pour vous. De cette façon, vous deux questions distinctes et en définitive, vous êtes concentrés sur la course de votre promesse contre une nouvelle promesse qui va rejeter à
x
milisecondes.Comment utiliser:
new Promise(cb) …
timeout
tenir une promesse directement, pas un rappel qui n'est passé à laPromise
constructeur. Il pourrait encourager la promesse du constructeur antipattern.Promise
constructeur ou unPromise
ou un tableau dePromises
mais j'ai senti la portée de la réponse a été limitée à la fonction de rappel et je ne voulais pas imposer confusiones dans le code. Je vais ajouter votre suggestion si.C'est un peu vieille question, mais je suis tombé sur ça quand j'étais à la recherche comment en attente d'une promesse.
Alors que toutes les réponses sont grands, j'ai trouvé à l'aide de bluebird mise en œuvre des Promesses comme le moyen le plus facile de manipulation des délais d'attente:
Comme vous pouvez le voir c'est donc beaucoup moins de travail que les autres solutions proposées. J'ai pensé que je vais le mettre ici pour le rendre plus facile pour les gens à trouver 🙂
Btw, je ne suis pas par tous les moyens impliqués dans le projet bluebird, juste trouvé cette solution très soignée.
À ajouter un délai à toute promesse, vous pouvez utiliser:
Puis plus tard:
Alors que les réponses données ici sont valables, vous ne devriez pas essayer de réinventer la roue et d'utiliser l'une des dizaines de paquets disponibles sur NPM pour l'auto-résolution de la promesse.
Voici un exemple de MNP: