J'ai une classe, Dans le code ci-dessous, j'utilise la bibliothèque de fermeture Notez que "tandis que"} "ISN ' t possible car ce serait synchrone (bloquant toute autre exécution JS). P> P> Charomer code>, qui ne peut que rendre après avoir reçu une demande HTTP à long terme (elle pourrait prendre 1 seconde ou 30 secondes). J'ai donc besoin de retarder le rendu jusqu'à ce que
chars.json code> n'est pas null.
Goog.Async.conitionnalDelay Code>
. Cela fonctionne, mais y a-t-il une meilleure façon (peut-être sans avoir besoin d'une bibliothèque de fermeture) pour le faire? P>
3 Réponses :
Considérez ceci:
(function wait() { if ( chatroom.json ) { chatroom.render(); } else { setTimeout( wait, 500 ); } })();
2021 et cela fonctionne toujours comme un charme.
La réponse que j'ai proposée est comme ceci: J'avais ceci pour une fonction de contrôle qui a couru une fois régulièrement et deux fois dans une boucle: P> (function wait() {
if ( chatroom.json ) {
chatroom.render();
} else {
setTimeout( wait, 500 );
}
})();
500 millisecondes sont une vie oui, mais tenant l'otage du fil JS que vous n'êtes pas. Les fonctions ASYNC en JavaScript ne sont pas du blocage de threads, ils sont mis en file d'attente à une exécution à un moment donné à l'avenir. La réponse acceptée est courante car elle est idiomatique javascript et est aussi performante que possible lorsque vous n'avez pas d'événement "prêt", vous pouvez répondre à.
Vous pouvez également réaliser cela en utilisant le déboqueur de Lodash avec récursion.
p>
import _debounce from 'lodash/debounce'; const wait = (() => { if ( chatroom.json ) { chatroom.render(); } else { _debounce(wait, 500)(); } })();
Pourquoi n'utilisez-vous pas le rappel de la demande HTTP?
Je ne peux pas utiliser ce rappel car le rendu peut être appelé avant que le JSON soit retourné, ou 10 minutes après son retour. Fondamentalement, je veux pouvoir appeler rendu () à tout moment de temps que je veux.
Vous pouvez toujours utiliser le rappel. Dans
Render Code>, vérifiez si le JSON a été renvoyé et, s'il n'a pas, ajoutez à un tableau de rappels. Ou utilisez simplement les nouveaux objets différés de JQuery, ce qui le fait pour vous.