(あなたがしたい場合は、jQueryを使って)私はJavaScriptで関数を記述しようとしています:非同期(コールバックベース)関数の実行をJavascriptの同期関数にラップするにはどうすればよいですか?
function fetchItem(itemId) { return /* ??? */; }
この関数は次のようになります第二、事前に定義されたとunmodifyable機能に依存しています:
function load(callback) { /* ... */ }
この関数は非同期です。それを呼び出した後、XHRを介してn個の項目をフェッチし、到着したらDOMに格納してからコールバックを呼び出します。
fetchItem
はitemId
と要素のDOMを確認するために、単純なjQueryのセレクタ(無関係ここ)を使用し、アイテムがまだ存在しない場合load
を呼び出します。すすぎ、繰り返します。
私の問題は、私はそれが十分load
通話をした後itemId
でDOM要素を返す必要があり、私の同期fetchItem
機能へload
の複数の非同期呼び出しをラップしたいということです。
擬似コード、load
が同期した場合:おそらく、Javascriptのの閉鎖や実行モデルについての誤解の多くを表示するJavaScriptでこれを行うことで
function fetchItem(itemId):
while not dom.contains(itemId):
load()
return dom.find(itemId)
私の最初の試み、:;)
function fetchItem(itemId) {
var match = undefined;
function finder() {
match = $(...).get(0);
if(!match) {
load(finder);
}
}
finder();
return match;
}
return
が最初のコールバックの前に実行されるため、明らかにこれは失敗します。また、あなたが見ることができるように、私はmatch
をfetchItem
に戻すいくつかの問題を抱えていました。ここは閉鎖によって適切に保護されていますか? load
がこれをサポートしていると仮定して、fetchItemが複数回並列に実行された場合(これはDOMを混在させません)
私はおそらくここに完全に良好なパターンを欠けているが、私は本当にするためにGoogleのか分からない...
コールバック自体が非同期ルーチンからの同期性を作成しますか?一つ後に起こっていること。 – Orbling
@Orbling:いいえ、そうではありません。最初に2つの非同期呼び出しのうちどれが終了したかを予測することはできません(同期は同期になります)。 – jwueller
いいえ。しかし、コードの一部が非同期呼び出しに続くように、または複数の非同期呼び出しが行われた後でも、コードを設定できます。疑問の唯一の点は、複数の非同期呼び出しが開始されたときの戻り順です。 – Orbling