1

通常、非同期関数は、たとえば、最後async(arg, cb)にコールバック関数プレースホルダー(cb)を提供するため、非同期ルーチンの終了時に独自のコードを実行できます。非同期関数にコールバック引数がない場合はどうなりますか?明らかにcb欠けているもの:

async(args);
myFunction();

myFunction()最初に実行されます。myFunction()終了後にのみ実行するにはどうすればよいasyncですか?独自のコールバックラッパーを作成しようとしましたが、成功しませんでした。それらは単に関数呼び出しをリダイレクトするだけでした。

編集私は上記の答えに興味がありますが、私がこの状況に遭遇した方法の例を示します。

私の例は、Googleマップのルート案内サービスです。非同期関数は、と呼ばれる描画ルーチンdirectionsDisplay.setDirections(result);であり、描画が完了した後、再センタリングしてズームインしたいと思います。setTimeoutやりたいことが起こるように3秒をまとめましたが、それは不器用な解決策です。GoogleMapsAPIを変更することは問題外のようです。何が良いでしょうか?

道順サービスはこちらです。

http://jsfiddle.net/ryxtj/1/

どちらかのドロップダウンで都市を選択するだけです。3秒後、マップが移動するはずです。

4

3 に答える 3

2

簡単なGoogle検索で、この関連記事が見つかりました:Google Maps V3 setDirections()コールバック

これは、方向が変わったときにイベントリスナーを追加することを示しています。

Javascriptはシングルスレッドであり、セマフォやミューテックスのような同期機能はありません。したがって、非同期関数が完了するか、非同期関数を同期関数に変換するまで、コードを「待機」させることはできません。

これを解決する唯一の方法は、イベントハンドラーやコールバック関数を使用することです。APIの自尊心のあるプロバイダーは、非同期関数にAPIを提供しますが、それがいつ完了するかを知る能力はありません。もしそうなら、それは本当に不器用なAPIであり、そのAPIのソース実装に入り、イベントの完了が処理される場所を見つけて、コールバックをインストールする必要があります(元のソースを変更することによって)。デザインで完了イベントまたは完了コールバックをすでに提供していない限り、コードの「外部」からできることは他にありません。

于 2012-04-22T19:04:10.047 に答える
2

確かに、DirectionsRendererにマップを再センタリングさせてから、自分で再度変更させるよりも、DirectionsRendererにマップを再センタリングしないように指示する方が良い解決策です。

その後、自由に再センタリングできます。

https://developers.google.com/maps/documentation/javascript/reference#DirectionsRendererOptionsを参照して ください

それをpreserveViewportに伝えることができます-そうすれば、厄介なリスナーを気にする必要はありません。

このように:http://jsfiddle.net/8kbf2/1/

于 2012-04-23T17:16:18.440 に答える
1

これにより、コールバック/イベントが提供されます。

google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
  // ... CALLBACK
});

出典:Google Maps V3 setDirections()コールバック

質問の他の部分:いいえ、非同期呼び出しを引き起こしているコードを変更したり、ハッキーなオーバーライドを行ったりせずに、非同期呼び出しを直接同期することはできません。

例:
コードがどのように非同期化されているかを把握することができます。おそらく、setTimeout(func、1)呼び出しです。次に、setTimeout関数をオーバーライドして呼び出しをフェッチし、コールバックを追加することができます。しかし、それはかなり汚れた解決策です。

于 2012-04-22T19:03:51.417 に答える