4

私は特定のアクションを持つフォームを持っています。フォームが送信されると、このアクションを呼び出す ajax 呼び出しを送信します。一方、進行状況を更新するために別の ajax 呼び出しを送信しています。私は次のようにしました:

    $("form").submit(function() {               
      function callBack()
      {
            if( (this.readyState == 4) && (this.status == 200) )
            {
              console.log(this.responseText);
            }
      }

      function updateProgress (){
        asyncReq('/get_progress?progress='+progress, callBack);
      }

      function asyncReq(url, functionCallBack)
      {
            var request; //request must be a local var to avoid race condition
            try
            {   //for modern browsers
              request = new XMLHttpRequest;
            }
            catch (err)
            {// legacy IE
              request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            request.onreadystatechange = callBack;
            request.open("GET", url, true);
            request.send();
      };
      var progress = $("#progress").val();
      asyncReq('/get_progress?progress='+progress, callBack);
      setTimeout(updateProgress, 2000);
      $(this).ajaxSubmit({async: true});
      return false;
   });

ここには 2 つの非同期 JavaScript 呼び出しがあります。1 つはフォームを送信するため、もう 1 つは進行状況を更新するためです。を印刷するとresponseTextcallBack0.0 と 1.0 しか表示されません。これは、ajaxSubmit()が呼び出される前と終了した後の 1 つです。進行状況のすべての価値を途中でも取得したいと思います。私が理解している限り、2番目のajax呼び出しasyncReqは、が終了した後にのみ呼び出されajaxSubmitます。完了する前に別の完全な ajax 呼び出しを行う方法について、誰かが私に何か考えを教えてくれますajaxSubmit()か?

ノート:

フォームはファイル フィールドとajaxSubmit解凍で構成され、ファイルを処理し、各ファイルが処理された後に進行状況テーブルを更新します。このget_progressメソッドは、そのテーブルの進捗値を抽出します。ajax呼び出しでフォームを送信するためにjquery.form.jsを使用しています。

4

5 に答える 5

2

2 秒後に 3 つの同時 ajax リクエストを送信しました。

  1. asyncReq('/get_progress?progress='+progress, callBack);
  2. setTimeout(updateProgress, 2000);(後で実行されます)
  3. $(this).ajaxSubmit({async: true});

古いブラウザを使用していますか? その場合、2 つの接続制限に達します。ブラウザでの最大並列 http 接続を参照してください。一般的なブラウザで許容される同時 AJAX (XmlHttpRequest) リクエストの数は?

同時リクエスト数に制限がある場合、タイムアウト リクエストはブラウザのキューに入れられ、ajax フォームまたは最初の進行が完了した後にのみ送信されます。

于 2012-10-26T01:09:26.683 に答える
2

あなたが何を達成しようとしたのかはわかりません。ただし、これはコードの簡略化されたバージョンです。

function updateProgress(){
    var progress = $("#progress").val();
    $.get('/get_progress?progress='+progress, function(data){
        //***you will get response in data
        //here you write how to handle progress and data
    }
    setTiemout('updateProgress()', 2000)

}
$('form').submit(function(){
    updateProgress();
    $(this).ajaxSubmit({async: true});
})

どのajaxSubmit()機能が実際にあなたのために何をするのかわかりません! 名前が示すように、フォームを送信するだけだと思います。進行状況を表示する独自のロジックを配置する場合は、そのロジックを***マークされた領域に配置するだけです。

于 2012-10-24T09:48:00.247 に答える
0

これを確認してください。

setTimeout関数は、指定された期間遅延してから、指定された関数の実行をトリガーします。関数がトリガーされると、setTimeoutが終了します。

setInterval関数は、特定の関数の実行をトリガーする前に、指定された時間だけ遅延します。異なる点は、その関数をトリガーした後、コマンドが完了しないことです。代わりに、指定された時間待機してから関数を再度トリガーし、Webページがアンロードされるか、clearInterval関数が呼び出されるまで、指定された間隔で関数をトリガーするこのプロセスを繰り返します。

于 2012-10-24T19:54:09.513 に答える
0

@HungryCoder の応答に従って、1 つだけ不足しています。フォーム送信からfalse を返す必要があります。

$('form').submit(function(){
    updateProgress();
    $(this).ajaxSubmit({async: true});
    return false;
});

return false がなくても、フォームは自然に動作します。または、submit イベント変数をキャプチャすることもできます。

$('form').submit(function( e ){
    e.preventDefault();
    updateProgress();
    $(this).ajaxSubmit({async: true});
    return false;
});

呼び出しe.preventDefault()は、フォームがデフォルトのブラウザー定義のアクティビティ (つまり、サーバーへの送信) を実行することも防ぎます。

于 2012-10-30T18:24:14.000 に答える
0

あなたのコードは、2000 ミリ秒後に一度だけ進行状況を更新しているようです。この行:

setTimeout(updateProgress, 2000);

代わりに更新間隔を設定してみましたか? これにより、そのコードは xxxx ミリ秒ごとに実行されます。このような:

myVar=setInterval(updateProgress,2000);

clearInterval次に、そのコードの実行を停止するために使用する必要があります。このような:

clearInterval(myVar);

変数 myVar を追加する必要があることに注意してください。機能に必要であり、clearInterval機能するために利用可能である必要があります。としてグローバルに定義する必要がある場合がありますvar myVar

于 2012-10-24T12:55:02.243 に答える