1

私がやろうとしているのは、一連のチェックボックスを通過することです。

チェックされているそれぞれについて、(ajax 呼び出しを使用して) いくつかの計算を実行する必要があります。エラーが発生した場合は、ループを中断してメッセージを返す必要があります。

すべての ajax 呼び出しの実行には約 0.4 秒かかりますが、一度に最大 4 つしかチェックできないため、問題になることはありません。

しかし、私が直面している問題は、エラー function() 内のアラート ボックスの前に最後のアラート ボックスがポップアップすることです。エラー関数は機能しますが、常に最後の関数の後に表示されます。

呼び出しを非同期 = false として定義すると、呼び出しが応答を返すまでコードの実行が待機するという印象を受けました。それは間違った仮定ですか?

これを達成する方法はありますか?

前もって感謝します

$("input[id*='chk_aut']").each(function() {
  if(this.value=="on") {
    $.ajax({
      type: "GET",
      url: "testpage.asp",
      cache:"false",
      async:"false",
      data: "which=checkvalues&value="
          + i_value
          + "&ref="+$("#cb_ref").val()
          + "&nif="+$("#txt_nif").val()
          + "&day="+i_day
          + "&month="+i_month
          + "&hours="+i_hours
          + "&year="+i_year + "&ms="
          + new Date().getTime(),
      success: function(msg) {
        //do something but continue the loop
      },
      error: function() {
        i_result =false;
        alert("An error has occurred");
        return false;//break the  loop
      }
    });
  }
});
alert(i_result);
4

4 に答える 4

6

マニュアルに記載されているように、error機能は...

リクエストが失敗した場合に呼び出される関数。

つまり、クライアントとサーバーの間に通信の問題がある場合(たとえば、タイムアウト、承認なしなど)。サーバー側スクリプトが、アプリケーションでエラーと見なされる値を返す場合は呼び出されません。そのコードをに移動しsuccess、応答データをチェックして、スクリプトが各要求をどのように処理したかを確認します。

また、同期呼び出しを使用するには、本当に正当な理由が必要になることにも言及しておく必要があります。はい、テストでは1.5秒しかかかりませんが、誰かの接続が遅い場合、またはサーバーに高負荷がかかっているか利用できない場合はどうなりますか?同期リクエストはクライアントのブラウザをフリーズさせ(つまり、タブの変更やスクロールの動作なども行わない)、ユーザーエクスペリエンスが非常に悪くなります。ページのUIをブロックしたい場合は、もっとフレンドリーな方法がたくさんあります。たとえば、BlockUIを確認してください。

手続き的ではなく、コールバックを使用して非同期的に考え始める方がはるかに優れています。最初に開始するときは少し苦労しますが(コードは必ずしも行ごとに実行されるとは限らないため)、コツをつかめば非常に強力で柔軟性があります。

于 2009-11-10T14:43:57.327 に答える
6

使う必要があると思います

,async: false

文字列"false"ではなく、ブール値の falseを渡すようにします。これにより、AJAX 呼び出しが同期されます。

同様の状況と詳細については、この質問を参照してください。特に、同期 AJAX 呼び出しの場合、success ハンドラーを使用できず、呼び出しが完了したら結果を返さなければならない場合があります (AJAX 呼び出し自体の範囲外です)。

可能であれば、非同期で動作できるようにコードを再構築するようにしてください。同期実行はブラウザにうまく変換されません。

あなたの状況で、各 AJAX 呼び出しを使用して、チェックされている各チェックボックスの結果を蓄積している場合は、作業値をウィンドウ変数に格納し、どの要求が返されたかを追跡することを検討してください。開始した AJAX 呼び出しのそれぞれに対して成功した応答を受け取ったと判断したら、アラート ボックスを開始するか、結果に対して実行したいその他のことを行うことができます。これは、非同期的に考え始める方法の一例にすぎません。

于 2009-11-10T14:50:39.667 に答える
4

async:false代わりに使用async:"false"してお楽しみください。

于 2010-09-21T12:08:26.990 に答える
0

私はajax呼び出しの非同期オプションに精通していません。私は同期ajax呼び出しが必要な状況で成功してjQueryAjaxManagerを使用してきました:http://plugins.jquery.com/project/AjaxManager

于 2009-11-10T14:43:03.123 に答える