ajax の最初の「a」は非同期を表すので、あなたがやろうとしていることは ajax の哲学に反するようなものです。ただし、ブロッキング リクエストを使用することは可能ですが、これは簡略化されたインターフェイスではサポートされていないため、関数.get
を使用する必要があります。.ajax
var foo = "hmmm";
$.ajax("jquery.js", {async:false, success:function(x){foo=x}});
alert(foo);
JavaScript の基本的な実行モデルはイベントベースでシングル スレッドです (マルチスレッド機能を提供する Web ワーカーがありますが、各ワーカーは独自のアドレス空間に存在し、他のワーカーやメイン スレッドとメモリを共有することはできません...スレッドよりもプロセスに似ているという意味です)。
Javascript では、他のことが起こるのをループで「待つ」ことはできません。関数は常にすぐに終了し、何かが起こったときに再度呼び出されるようにコールバックをアタッチする必要があります。ループを作成すると、JavaScript エンジンはそのループでスタックし、他の処理を実行できなくなります (JavaScript から可視である場合)。例えば:
// Warning: WRONG example... this won't work!
var foo = 0;
setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms
while (foo == 0) ; // Wait for that to happen
alert(foo);
メイン コード パスが終了するまで、ブラウザー エンジンは他の JavaScript コード (タイムアウト コールバック) を実行できないため、動作しません。
このイベントベースのアプローチは、プログラミングをかなり簡素化します (ロックが必要ないため... 状態を操作するスレッドは常に 1 つだけです) が、長時間の操作には別のフロー設計を使用する必要があります。
単一の実行スレッドがあるという事実は、JavaScript コードが長い計算を実行している間、他のすべてがブロックされ、ブラウザーがユーザーに対して応答していないように見えることも意味します。
この無応答性が、リソースを取得するための同期呼び出しの使用が悪い習慣と見なされる理由です...複数のストリームから異なるリソースを同時に取得するという困難な仕事は、ブラウザーによって既に実装されていますが、JavaScript コードはコールバック モデルを使用する必要があります。この機能を利用することができます。