De façon asynchrone retard JS jusqu'à ce qu'une condition est remplie
J'ai une classe, ChatRoom
, qui ne peut que rendre une fois qu'il reçoit une requête HTTP (elle peut prendre 1 seconde ou 30 secondes). J'ai donc besoin de délai de rendu jusqu'à ChatRoom.json
n'est pas null.
Dans le code ci-dessous, je suis en utilisant la Fermeture de la Bibliothèque goog.async.ConditionalDelay
. Il fonctionne, mais est-il une meilleure façon (peut-être sans avoir besoin de la Fermeture de la Bibliothèque) pour ce faire?
ChatRoom.prototype.json = null; //received after a long-running HTTP request.
ChatRoom.prototype.render = function() {
var thisChatRoom = this;
function onReady() {
console.log("Received JSON", thisChatRoom.json);
//Do rendering...
}
function onFailure() {
alert('Sorry, an error occurred. The chat room couldn\'t open');
}
function isReady() {
if (thisChatRoom.json != null) {
return true;
}
console.log("Waiting for chat room JSON...");
return false;
}
//If there is a JSON request in progress, wait until it completes.
if (isReady()) {
onReady();
} else {
var delay = new goog.async.ConditionalDelay(isReady);
delay.onSuccess = onReady;
delay.onFailure = onFailure;
delay.start(500, 5000);
}
}
Note que "tout (json == null) { }" n'est pas possible parce que ce serait synchrone (blocage de tous les autres JS exécution).
- Pourquoi vous n'utilisez pas la fonction de rappel de la requête HTTP?
- Je ne peux pas utiliser ce rappel, car le rendu pourrait être appelée avant que le JSON est retourné, ou 10 minutes après il est retourné. Fondamentalement, je veux être en mesure d'appeler render() à n'importe quel point dans le temps que je veux.
- Vous pouvez toujours utiliser la fonction de rappel. Dans
render
, vérifiez si le JSON a été retourné, et, si ce n'est pas le cas, ajouter à un tableau de rappels. Ou tout simplement utiliser du jQuery nouveau Différé d'objets, qui le fait pour vous.
Vous devez vous connecter pour publier un commentaire.
Considérez ceci:
Il s'agira de vérifier toutes les demi-secondes.
Démo Live: http://jsfiddle.net/kBgTx/
Vous pouvez également le faire en utilisant un lodash de debouncer avec la récursivité.
JS:
La réponse, je suis venu avec est comme ceci:
J'ai eu ce pour une fonction de contrôle qui a couru une fois régulièrement et deux fois dans une boucle:
Enfin, je tiens à souligner de façon significative les performances de la faute de l'autre (et extraordinairement ordinaires) réponse:
Dans ce cas, vous êtes essentiellement en maintenant le navigateur ou le serveur (Si vous utilisez node.js) en otage pour les 500 millisecondes pour chaque case qui est un temps incroyablement long pour un ordinateur. Le sens d'un énorme gain de performance. Ma solution de directement de garder la trace des dûment complétée fonctions est libre de contraintes de temps et d'exécuter instantanément dès que toutes les fonctions complètes.