Ho una classe, ChatRoom
, che può eseguire il rendering solo dopo aver ricevuto una richiesta HTTP di lunga durata (potrebbe richiedere 1 secondo o 30 secondi). Quindi ho bisogno di ritardare il rendering fino al ChatRoom.json
non è nullo.Ritarda in modo asincrono JS finché non viene soddisfatta una condizione
Nel codice seguente, sto usandodella libreria di chiusura. Funziona, ma c'è un modo migliore (forse senza bisogno di chiudere la libreria) per fare questo?
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);
}
}
nota che "mentre (json == null) {}" non è possibile perché sarebbe sincrono (bloccando ogni altra esecuzione JS).
Perché non si utilizza la richiamata dalla richiesta HTTP? – SLaks
Non riesco a utilizzare quella richiamata perché il rendering potrebbe essere chiamato prima che venga restituito JSON o 10 minuti dopo che è stato restituito. Fondamentalmente, voglio essere in grado di chiamare render() in qualsiasi momento nel tempo che voglio. –
È ancora possibile utilizzare il callback. In 'render', controlla se il JSON è stato restituito e, in caso contrario, aggiungi a un array di callback. O semplicemente usa i nuovi oggetti Deferred di jQuery, che fa questo per te. – SLaks