6

Dojo Deferredsの推奨される使用例は、dojo.when(def)またはdef.then()を使用し、Deferredが解決されたときのコールバックを提供することです。ただし、現在のスレッドを続行する前に、そのDeferredが完了するのを本当に待つ必要があるシナリオに遭遇することがあります。これが例です( http://jsfiddle.net/DG3Ax/2/の完全な例)

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()存在しませんが、それが私が探している機能です。getSomething()を呼び出すコードを制御できないため、Deferredを処理することはできません。実際の結果が必要です。

xhrGet()には同期パラメーターがあり、これがAJAX呼び出しの場合に機能すると思いますが、必ずしもそうとは限りません。これを達成する他の方法はありますか?

4

1 に答える 1

4

dojo-interestメーリングリストから非常に役立つ回答を得たので、ここに貼り付けたいと思いました。

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

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

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

于 2012-09-28T12:47:03.747 に答える