3

私はこの非同期機能を持っているとしましょう:

function fooAsync(){
  callSomeApi(some_args, callbackFunction(results){
    return results; //i want to return the results here after the api call.
  }
}

prev 関数からの戻り値を var に割り当て、この値がある場合にのみコードを続行する方法を探しています。

//some code here
var foo = fooAsync();
//some code here after getting back from the async function.

問題は、内部の非同期 API 呼び出しが終了する前に javascript が返されるため、foo が未定義になることです。そのためにコールバックを使用できることはわかっていますが、非同期関数を「ロック」して、結果が得られたときにのみ再開する方法を探しています。そうすれば、非同期呼び出しの後にすべてのコードをコールバックとして渡す必要がなくなります。

短くするために-通常の同期方法で非同期ajax呼び出し(私の場合はGoogleマップAPIを呼び出します)から値を返すにはどうすればよいですか?

4

1 に答える 1

4

一般に、ajax呼び出しを同期化することはお勧めできません。XMLHttpRequestオブジェクトには、同期ajaxリクエストを作成するために設定できるプロパティがあります(jQueryを使用すると、これを簡単に行うことができます)。Google Maps APIがこの機能を公開しているかどうかはわかりませんが、最初に確認する必要があります。

コールバックを使用したくないが、次のようなことは別として、あなたが言ったことは知っています。

while(foo === undefined){
  sleep(5) //pseudo code sleep method
}

現在の実行コンテキストをロックダウンする方法は実際にはありません。

また、提供したコードを使用すると、そのメソッドはundefined以外のものを返すことはありません。apiメソッド(非同期で実行)を呼び出し、すぐに制御を返します。apiメソッド呼び出しの応答ハンドラー内の「return」ステートメントは、無名関数内でのみ返されます。したがって、結果が返されるまでスレッドをロックできたとしても、それらはありません。

ただし、これを正しい方法で実行することに関心がある場合は、jQueryが提供するdeferred/promiseモデルを使用する必要があります。

function fooAsync(){
  var deferred = $.Deferred();
  callSomeApi(some_args, callbackFunction(results){
    deferred.resolve(results) //i want to return the results here after the api call.
  }
  return deferred.promise();
}

次に、呼び出しコードを次のように変更します。

//some code here
$.when(fooAsync()).then(function(results){
    //use the results
});
//some code here after getting back from the async function.

jQueryの遅延オブジェクトのドキュメント

于 2012-07-20T19:37:38.860 に答える