期待するのは、同期(ブロッキング)タイプの要求です。
var it_works = false;
jQuery.ajax({
type: "POST",
url: 'some_file.php',
success: function (data) {
it_works = true;
},
async: false // <- this turns it into synchronous
});
// Execution is BLOCKED until request finishes.
// it_works is available
alert(it_works);
リクエストはデフォルトで非同期(非ブロッキング)です。つまり、ブラウザは作業を続行するためにリクエストが完了するのを待ちません。そのため、アラートの結果が間違っていました。
これで、オプションでリクエストを同期jQuery.ajax
するように設定できます。つまり、スクリプトはリクエストが終了した後も実行を継続します。
ただし、推奨される方法は、コードをリファクタリングして、リクエストが終了するとすぐにデータがコールバック関数に渡されるようにすることです。実行をブロックすることは、受け入れられないUIをブロックすることを意味するため、これが推奨されます。このようにしてください:
$.post("some_file.php", '', function(data) {
iDependOnMyParameter(data);
});
function iDependOnMyParameter(param) {
// You should do your work here that depends on the result of the request!
alert(param)
}
// All code here should be INDEPENDENT of the result of your AJAX request
// ...
非同期プログラミングは、要求を行った結果が要求ステートメントに従う代わりに関数にカプセル化されるため、少し複雑になります。ただし、サーバーやネットワークの速度が低下してもブラウザがクラッシュしたかのように動作することはないため、ユーザーエクスペリエンスのリアルタイムの動作は大幅に向上する可能性があります。同期プログラミングは無礼
であり、人々が使用するアプリケーションでは使用しないでください。
ダグラス・クロックフォード (YUIブログ)