2012-09-27 9 views
6

Ich weiß, dass der empfohlene Anwendungsfall für Dojo Deferreds darin besteht, dojo.when (def) oder def.then() zu verwenden und einen Rückruf für den Fall bereitzustellen, dass der Deferred aufgelöst wird. Manchmal stoße ich jedoch auf ein Szenarium, in dem ich wirklich darauf warten muss, dass Deferred beendet wird, bevor ich mit dem aktuellen Thread fortfahre. Hier ist ein Beispiel (vollständiges Beispiel bei http://jsfiddle.net/DG3Ax/2/)Wie kann ich blockieren, bis Dojo Deferred aufgelöst wird?

function getSomething() { 
    var def = getSomeDeferred(); 

    def.then(function(result) { 
     dojo.place("<li>def.then() = " + result + "</li>", "output"); 
    }); 

    return def.gimmeTheResultNow(); 
} 

dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output"); 

Offensichtlich Deferred.gimmeTheResultNow() nicht vorhanden ist, aber das ist die Funktionalität ich suche. Ich habe keine Kontrolle über den Code, der getSomething() aufruft, also kann ich es nicht mit einem Deferred umgehen; Es braucht das wirkliche Ergebnis.

Ich weiß, dass xhrGet() hat eine Sync-Parameter, die ich denke, würde die Arbeit tun, wenn dies ein AJAX-Aufruf wäre, aber das ist nicht unbedingt der Fall. Gibt es einen anderen Weg, dies zu erreichen?

+3

Ich weiß nicht, was Ihr verzögert tut, aber scheint, wie Sie es loswerden sollten. Verzögerte Werte gelten für nicht blockierendes asynchrones Verhalten. – bfavaretto

Antwort

4

bekam ich einen very helpful answer aus der Mailingliste Dojo-Interesse, so dass ich dachte, dass ich es hier bleiben würde: Leider

, können Sie dies im Browser nicht.

JavaScript im Browser ist single-threaded. Wenn Sie darauf warten, a Deferred zu lösen, dann verwenden Sie diesen Thread. Dies ist der gleiche Thread, der irgendwo auf der ganzen Linie benötigt wird, um einen Anruf an Deferred.resolve() zu erledigen (was selbst dann zu einem Aufruf der -Funktion führen würde, die Sie an .then() weitergegeben haben).

Sie können xhr synchron aufrufen, da die Basis-Implementierung des XHR get es ermöglicht, sie synchron aufzurufen. Die Funktionalität von dojo/Defered ist nur ein Wrapper rund um die XHR-Interna.

Verwandte Themen