web-dev-qa-db-ja.com

非同期タスクが完了するのを待ちます

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

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

function sync_call(input) {
    var value;

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

    return value;
}

JQueryの遅延と約束を試しましたが、非同期設計パターンを目指しているようです。コードで同期パターンを使用したい。

37
Code Different

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

自然なことや言語行動に組み込まれていることと戦おうとしないでください。コールバックテクニックまたはプロミスを使用する必要があります。

function f(input, callback) {
    var value;

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

}

もう1つのオプションは、promiseを使用することです。 [〜#〜] q [〜#〜] を見てください。この方法では、promiseを返し、それからthenリスナーをアタッチします。これは基本的にコールバックと同じです。約束が解決すると、thenがトリガーされます。

31
bitoiu

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

function sync_call(input) {
    var value;

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