61

質問はかなり単純で技術的です:

var it_works = false;

$.post("some_file.php", '', function(data) {

     it_works = true;

});

alert(it_works); # false (yes, that 'alert' has to be here and not inside $.post itself)

私が達成したいのは:

alert(it_works); # true

それを行う方法はありますか?そうでない場合は$.post()、適用する値を返すことができit_worksますか?

4

4 に答える 4

105

期待するのは、同期ブロッキング)タイプの要求です。

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ブログ

于 2010-07-11T08:22:16.260 に答える
7

AJAXはAsynchronousJavaScriptandXMLの略です。したがって、サーバーへの投稿は、関数の残りの部分と同期していない状態で発生します。代わりに、このようなコードを試してください(短縮形$.postを長い$.ajax呼び出しに分割し、asyncオプションを追加するだけです)。

var it_works = false;

$.ajax({
  type: 'POST',
  async: false,
  url: "some_file.php",
  data: "",
  success: function() {it_works = true;}
});

alert(it_works);

お役に立てれば!

于 2010-07-11T08:23:47.620 に答える
5

あなたの問題は単に並行性の問題のようです。post関数は、コールバック引数を取り、投稿が終了したことを通知します。このようにグローバルスコープでアラートを作成して、投稿がすでに終了していることを期待することはできません。コールバック関数に移動する必要があります。

于 2010-07-11T08:19:20.670 に答える
4

コードが失敗する理由は、サーバーへの非同期post()リクエストを開始するためです。それがあなたにとって意味することは、あなたが期待しているように、リクエストが完了した後ではなく、すぐに戻るということです。post()

したがって、必要なのは、要求を同期させ、要求が完了するまで現在のスレッドをブロックすることです。したがって、

var it_works = false;

$.ajax({
  url: 'some_file.php',
  async: false,  # makes request synchronous
  success: function() {
    it_works = true;
  }
});

alert(it_works);
于 2010-07-11T09:19:42.847 に答える