3

jQueryレコード挿入プロセスで2つの問題が発生しています。このすばらしいSOコミュニティが、これらの問題の少なくとも1つを解決するのに役立つことを願っています。これらは問題です:

問題1-サーバーの断続的な遅延

最初の問題は、私のUbuntu10.04サーバーPOSTがmySQLデータベースにデータを送信するときに断続的な4.5秒の遅延を示すように見えるという事実に関連しています。ほとんどのPOSTコマンドは通常のミリ秒以内に実行されますが、遅延が発生すると、常に約4.5秒のように見えます。これはビジーなパブリックサーバーではないため、サーバーの負荷が問題になることはありません。これらの短いビデオは、私が説明しようとしていることを示しています。

ビデオ1 ビデオ2

serverfaultに質問を投稿し、この問題1におそらくより適切なフォーラムからの入力を待っています。

問題2-jQueryのPOSTメソッドとGETメソッドのタイミング

私が解決しようとしている本当の問題は、GETすべての呼び出しPOST完了する前にへの呼び出しを防ぐことです。現在、$.when.applyの送信を遅らせるために実装していGETます。そのためのコードは次のとおりです。

function(){
  $.when.apply(undefined, InsertTheAPPs()).done(function (){
    $.ajax({
      url: sURL + "fileappeal/send_apps_email",
      success: function() {
        var m = $.msg("my message",
        {header:'my header', live:10000});
        setTimeout(function(){
          if(m)m.setBody('...my other message.');
        },3000);
        setTimeout(function(){
          if(m)m.close(function(){
              window.location.replace(sURL+'client/view');
          });
        },6000);
        $('#ajaxShield').fadeOut(1000);
      },
      error: function(){
          $.msg("error message",
          {header:'error header', live:10000});
      }
    });
  });
}

上記の問題1で説明した遅延が原因で問題が発生します。すべてのメソッドが開始GETされた後にメソッドが呼び出されていますが、すべてのメソッドが終了するまでメソッドを待機する必要があります。これは私が支援を必要としている問題です。基本的に、ここで起こっているのは、すべてのレコードがmySQLデータベースに完全に挿入される前に確認メールが送信されているということです。POSTGETPOST

jQuery$.eachループのコードは次のとおりです。これは、開始するだけでなく、上記のajax呼び出しの前に終了する必要があるコードです。fileappeal/send_apps_email

function InsertTheAPPs(){
  $('input[name=c_maybe].c_box').each(function(){
    var jqxhrs = [];
    if($(this).prop('checked')){
      var rn = $(this).prop('value');
      jqxhrs.push(
        $.ajax({
          url: sURL + 'fileappeal/insert_app',
          type:"POST",
          dataType: 'text',
          data: {'rn': rn},
          error: function(data) {console.log('Error:'+rn+'_'+data);}
        })
      )
    return jqxhrs;
    }
  });
}

GETサーバー遅延の問題を回避し、すべてのPOSTメソッドが完了する前にへの呼び出しを防ぐ方法について、誰か提案がありますか?ありがとう。

4

1 に答える 1

1

投稿に小さな問題があります。それを解決した後、この投稿はあなたがあなたのコードを完成させるのを助けるはずです:jQueryDeferred-複数のAJAXリクエストが終了するのを待っています

内部に戻っています.eachが、関数自体は何も返しません。したがって、遅延には、待機するajax呼び出しの配列が与えられていません。また、jqhrsはそれぞれの内部で定義されているため、スコープは各c_boxの反復ごとになります。メソッドは次のようになります。

function InsertTheAPPs(){
    var jqxhrs = [];

    $('input[name=c_maybe].c_box').each(function(){         
        if($(this).prop('checked')){ 
            var rn = $(this).prop('value'); 
            jqxhrs.push(
                $.ajax({
                    url: sURL + 'fileappeal/insert_app',
                    type:"POST",
                    dataType: 'text',
                    data: {'rn': rn},
                    error: function(data) {console.log('Error:'+rn+'_'+data);}
                })
            )
        }
    });

    return jqxhrs;
} 

コードを簡単にすることもできます。何かがチェックされているかどうかを知りたいだけなので、次のようなjquery疑似クラスフィルターを使用できます:checked

function InsertTheAPPs(){
    var jqxhrs = [];

    $('input[name=c_maybe].c_box').filter(':checked').each(function(){         
        var rn = $(this).prop('value'); 
        jqxhrs.push(
            $.ajax({
                url: sURL + 'fileappeal/insert_app',
                type:"POST",
                dataType: 'text',
                data: {'rn': rn},
                error: function(data) {console.log('Error:'+rn+'_'+data);}
            })
        )
    });

    return jqxhrs;
} 

:checkedのようなメインフィルターにフィルターを組み合わせることができますが、$('input[name=c_maybe].c_box:checked')実際に何が起こっているのかを示すために、長い形式のままにしました。

于 2013-01-30T15:18:45.143 に答える