53

一部の関数呼び出しが非同期であるサードパーティの JavaScript ライブラリを操作しています。非同期ロジックをアプリケーションに組み込む代わりに、これらの非同期呼び出しに同期ラッパーを作成することを好みました。私は知っています、私は知っています、それはひどいデザインですが、これは完全に書き直される可能性が非常に高いデモプロジェクトです. チームにコンセプトを示す何かが必要ですが、まだパフォーマンスを心配する必要はありません。

これが私がやりたいことです:

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {value = result;} );

    return value;
}

jQuery の deferred と promise を試してみましたが、async のデザイン パターンを狙っているようです。コードで同期パターンを使用したいと考えています。

4

3 に答える 3

38

JS VM がその async_call から移動し、まだ設定していない値を返したため、これは機能しません

自然で、言語の振る舞いに組み込まれているものと戦おうとしないでください。コールバック手法または promise を使用する必要があります。

function f(input, callback) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) { callback(result) };

}

他のオプションは、プロミスを使用することです。 Qを見てください。このようにして promise を返し、その後に then リスナーをアタッチします。これは基本的にコールバックと同じです。promise が解決されると、 then がトリガーされます。

于 2013-09-10T22:33:01.553 に答える
1

sync_call() で値を返す代わりに、コールバック内から関数を呼び出すのはどうですか?

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {
        value = result;
        use_value(value);
    } );
}
于 2013-09-10T22:31:13.687 に答える