2012-09-27 3 views
6

Dojo Deferredsの推奨使用例は、dojo.when(def)またはdef.then()を使用し、Deferredが解決されたときのコールバックを提供することです。しかし、時々私は現実のスレッドに進む前にDeferredが完了するのを待つ必要がある状況に遭遇します。ここでDojo Deferredが解決されるまでどのようにブロックできますか?

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"); 

が明らかDeferred.gimmeTheResultNow()が存在しない例(http://jsfiddle.net/DG3Ax/2/の完全な例では)ですが、それは私が探している機能です。私はgetSomething()を呼び出すコードを制御していないので、それをDeferredにすることはできません。実際の結果が必要です。

xhrGet()には、これがAJAX呼び出しの場合はジョブを実行すると思われるsyncパラメータがありますが、必ずしもそうであるとは限りません。これを達成する他の方法はありますか?

+3

私はあなたの延期が何をしているのか分かりませんが、あなたはそれを取り除かなければならないようです。遅延は、非ブロッキング、非同期動作用です。 – bfavaretto

答えて

4

私は道場金利メーリングリストからvery helpful answerを得たので、私は、私はここでそれを固執しようと思いました:

残念ながら、ブラウザでこれを行うことはできません。

ブラウザのJavaScriptはシングルスレッドです。 Deferredが解決するのを待っている場合は、そのスレッドを使用しています。これは Deferred.resolve()への呼び出しを処理するために、ラインの下のどこかで必要となるスレッド です(それ自体、.then()に渡した 関数への呼び出しになります)。

XHR getの基本実装では、これを同期的に呼び出すことができるため、xhrを同期して呼び出すことができます。 dojo/Deferred の機能は、XHR内部のラッパーです。

関連する問題