6

私は Web コーディングが初めてで、最近 JQuery で遊んでいます。いくつかの動作に気付き、それが正常な動作であり、それに対処する最善の方法であるかどうかを知りたいと思いました.

Web サーバーへの単純な取得を行っていますが、サーバーが結果を返すのに数分かかる場合があります。私が気付いたのは、サーバー側のコードが複数回呼び出されていることです。この場合、「/userprofile」は最大 3 回呼び出すことができます。

("li#user").click(function(){
    $.get('/userprofile',{partialrender: 'true' },
        function (data) {
          $("div#content").html(data); 
    });
});

私の質問は次のとおりです。

1) これは正常な動作ですか? 2)そうであれば、余分な呼び出しを行っているのはJQueryですか、それともブラウザですか? 3)これを処理する良い方法は何ですか?

質問3への回答は難しいかもしれませんが、何か助けていただければ幸いです。

どうもありがとう。

アップデート:

みんなありがとう、

バックエンドデータベースが小さいため、その正確な呼び出しで問題を生成することはできませんが、別の同一の呼び出しで問題を生成できます。get の直前にアラート呼び出しを入れ、一度だけ呼び出されました。私は Mojolicious ウェブフレームワークを使用しているので、それと何か関係があるのでしょうか? Morbo Web サーバーを使用しています。

この動作を示している私のコードは次のとおりです

("li#importDevice").click(function(){
    alert('import clicked');
    $.get('/importDevice',{device: 'corptest' },
       function (data) {
         $("div#content").html(data); 
   });
 })



sub importDevice {
  my $self = shift;
  my $res = "test";
  my $dir      = $self->session("dir");
  my ($debug, $log, $path, $upload) = createLogHandles($self);
  my %deviceEntry = device::getDeviceEntry($devicename);
  print "In Import   Device \n";
  return $self->redirect_to('failed') unless $self->session('role') eq 'admin';

  my %sessiondetails = utils::buildSessionDetails(%deviceEntry);

 #THE FUNCTION BELOW IS WHERE THE DELAY CAN BE. 
 my $result = utils::connectToDevice(\%sessiondetails);

  if ($result ne 'failedconnect') {
    Vendor::importConfig($session,$dir);
    Vendor::processConfig($dir,$debug,$upload);
  }  
$self->render(text => $result);  
}

utile::connectToDevice の応答に時間がかかる場合、コールバック全体が再度呼び出されていることがわかります。

そして、これが私の morbo ウェブサーバー ログからの出力です。2 つの呼び出しを受けているように見えます。

[Thu Nov 22 00:22:27 2012] [debug] GET /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11).
[Thu Nov 22 00:22:27 2012] [debug] Routing to controller "MyApp::DevT" and action "importDevice".
[Thu Nov 22 00:22:50 2012] [debug] 200 OK (22.117681s, 0.045/s).
[Thu Nov 22 00:22:50 2012] [debug] GET /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11).
[Thu Nov 22 00:22:50 2012] [debug] Routing to controller "MyApp::DevT" and action "importDevice".
4

1 に答える 1

1

ajax呼び出しを行う際の私の提案は、サーバーに対してすでに要求が行われていることを示すフラグを設定することです。毎回フラグをチェックし、ステータスに応じてリクエストするかどうかを決定します。サーバーから応答を受け取ったら、フラグをリセットします。だからあなたはこれを試すことができます-

var running=false;
$("li#user").click(function(){

    if(!running){
       running=true;
       $.get('/userprofile',{partialrender: 'true' },
        function (data) {
          $("div#content").html(data);
          running=false; 
       });
    }
});

これにより、ユーザーがボタンを100回クリックして、リクエストが殺到する状況を回避できます。

アップデート

if条件のエラーを削除しました。

上記のことが役に立たない場合は、これを行ってください。

$("li#user").unbind('click').click(function(){
   // do the thing
});

これにより、すべてのクリックハンドラーとイベントが要素から切り離され、再度バインドされます。

于 2012-11-22T06:23:52.417 に答える