10
votes

Délai d'asynchronement JS jusqu'à ce qu'une condition soit remplie

J'ai une classe, Charomer , 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 n'est pas null.

Dans le code ci-dessous, j'utilise la bibliothèque de fermeture Goog.Async.conitionnalDelay . 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? xxx

Notez que "tandis que"} "ISN ' t possible car ce serait synchrone (bloquant toute autre exécution JS).


3 commentaires

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 , 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.


3 Réponses :


28
votes

Considérez ceci:

(function wait() {
    if ( chatroom.json ) {
        chatroom.render();
    } else {
        setTimeout( wait, 500 );
    }
})();


1 commentaires

2021 et cela fonctionne toujours comme un charme.



-1
votes

La réponse que j'ai proposée est comme ceci: xxx pré>

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 );
    }
})();


1 commentaires

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 à.



1
votes

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)();
    }
})();


0 commentaires