La mise en œuvre de délais d'attente pour node.js rappels
C'est une situation typique dans node.js:
asyncFunction(arguments, callback);
Quand asynFunction
terminée, callback
est appelée. Un problème que je vois avec ce modèle est que, si asyncFunction
jamais complète (et asynFunction
n'est pas un construit-dans le temps-système), puis callback
ne sera jamais appelé. Pire, il semble que callback
a aucun moyen de déterminer qui asynFunction
ne reviendra jamais.
Je veux mettre en œuvre un "timeout": si callback
n'a pas été appelé par asyncFunction
dans un délai de 1 seconde, puis callback
est automatiquement appelée avec l'hypothèse que asynFunction
a erronées sur. Quel est le niveau moyen de faire cela?
- Le standard est que
callback
obtient toujours appelé. - Comment pouvez-vous garantir que? Dire un serveur meurt...
- L'autre serveur uniquement comunicates w/ votre code et n'est pas resonsible à l'appel de votre rappels directement.
asyncFunction
, et la partie qui en fait des appelscallback
sont tous sur votre côté de la clôture, de sorte qu'il est raisonnable de s'attendre qu'il devrait faire ce genre d'erreur de manipulation pour vous.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas familier avec les bibliothèques qui font cela, mais il n'est pas difficile de fil vous-même.
Vous avez probablement besoin de sortir avec une solution de votre propre. Comme
et puis
Vous pourriez faire quelque chose comme ceci:
Utilisation:
DÉMO
Mais notez les points suivants:
Le délai d'attente est commencé immédiatement lorsque vous appelez
ensureExecution
, de sorte que vous ne pouvez pas cacher que la fonction de référence.Les arguments passés à la fonction de rappel sera différent. Par exemple
asyncFunction
peut passer des arguments àcallback
en cas de succès, mais si la fonction est appelée par le délai d'attente, pas d'arguments seront passées. Vous devez garder cela à l'esprit. Vous pouvez également fournir des arguments par défaut avec laquelle la fonction doit être appelée dans ce cas:func
sans paramètres.J'ai rencontré le même problème avec un script contenu en essayant d'ouvrir le port sur le BG de l'extension avant le BG extension était prêt. Un travail autour d'attente pour le BG d'extension pour répondre à un message et répétez cette opération jusqu'à réussir. Voici les extraits de code.
Contenu Du Script:
BG Extension
Dans mon cas, il est habituellement pris après le premier délai de 100ms.