これはJavascriptの一般的な問題です。 Javascriptコードは継続渡しスタイルで記述する必要があります。その迷惑なものですが、あなたはあまり考えずに変えることができます。
Basicaly、我々は
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
のようなものを持っているでしょうたび私たちは、機能が継続関数に戻った後、すべてのコードを作成し、パラメータに変数からのxを回して、非同期コードに変換することができます継続コールバック。
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
あなたは非常に分かりやすいコードを書くことに注意しなければなりません。心に留めておくべき良いトリックは、自分の関数がコールバックを受け取れるようにすることです。これは
var getXyz = function(onResult){ //async functions that return do so via callbacks
//you can also another callback for errors (kind of analogous to throw)
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely.
});
};
getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead.
console.log('got xyz');
});
(値を返す通常の同期のヘルパー関数は、異なる機能で使用することができます同じように)彼らは別の関数で使用することができ、ここでのトリックはへの呼び出しに関数からのすべてのreturn文を変更することですコールバック関数。あたかもasync関数が返されなかったかのように考えて、誰かに値を返す唯一の方法は、その値をコールバックに渡すことです。
あなたはなぜこれを行うのが簡単でないのかと尋ねるかもしれません。さて、あなたはJavascriptの代わりに別の言語を使用しない限り(あるいは少なくとも同期的なスタイルで非同期コードを書くことができるが、通常のJavaScriptに自動的にコンパイルするものを使用しない限り)
'var'キーワードをあなたの最初の 'xyz'の前に、あなたのajaxリクエストが完了した後に実行される任意の関数で、そのスコープ内のどこでも使用できます。 – Paulpro
* **同期** AJAX(これは* jQueryで*文書化されています)の間は、ユーザーエクスペリエンスに悪影響を与えるため、通常避けるべきです*。代わりに、非同期AJAXのイベントベースのモデルを使用することに焦点を当てます。つまり、コールバック内からDOMを 'xyz' *で更新します。 –
@pst。いつも同じ質問。この1つとDOMの準備問題。 – gdoron