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.
InformationsquelleAutor Amy B | 2011-09-26