2012-11-22 28 views
6

Tôi mới sử dụng mã hóa web và đã được chơi với JQuery gần đây. Tôi đã nhận thấy một số hành vi và muốn biết nếu nó là hành vi bình thường và cách tốt nhất để đối phó với nó.Hành vi Jquery.get khi hết thời gian chờ?

Tôi đang thực hiện một thao tác đơn giản với máy chủ web của mình, đôi khi máy chủ có thể mất một vài phút để trả về kết quả của nó. Những gì tôi nhận thấy là mã phía máy chủ của tôi được gọi nhiều lần, trong trường hợp này '/ userprofile' có thể được gọi lên đến 3 lần.

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

Vì vậy, câu hỏi của tôi là;

1) Đây có phải là hành vi bình thường không? và 2) nếu có thì JQuery thực hiện cuộc gọi bổ sung hoặc trình duyệt? 3) Một số cách xử lý tốt điều này là gì?

Tôi đánh giá cao câu trả lời cho câu hỏi 3 có thể là một câu hỏi khó, nhưng bất kỳ trợ giúp nào cũng được đánh giá cao.

Rất cám ơn.

UPDATE:

Cảm ơn Guys,

ok vì vậy tôi không thể tạo ra các vấn đề với điều đó gọi chính xác do cơ sở dữ liệu backend là nhỏ nhưng tôi có thể với một cuộc gọi giống hệt nhau. Tôi đặt một cuộc gọi cảnh báo ngay trước khi nhận được và nó chỉ được gọi một lần. Tôi đang sử dụng webframework Mojolicious, vì vậy tôi tự hỏi nếu nó có thể có một cái gì đó để làm với điều đó? Tôi đang sử dụng máy chủ web Morbo.

Đây là mã của tôi được trưng bày hành vi này

("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); 
} 

Khi utile tôi :: connectToDevice mất một thời gian để trả lời, tôi thấy rằng toàn bộ callback được gọi một lần nữa.

Và đây là kết quả từ nhật ký máy chủ web của tôi. APPEAR nhận được hai cuộc gọi.

[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". 

Trả lời

1

Đề xuất của tôi khi thực hiện cuộc gọi ajax sẽ là, đặt cờ cho biết đã có yêu cầu được gửi tới máy chủ. Kiểm tra cờ mỗi lần và tùy thuộc vào trạng thái của nó quyết định có nên thực hiện yêu cầu hay không. Khi bạn nhận được phản hồi từ máy chủ, hãy đặt lại cờ. Vì vậy, bạn có thể thử này -

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

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

Điều này sẽ tránh tình trạng người sử dụng click vào nút 100 lần và yêu cầu lũ lụt.

Cập nhật

lỗi Removed nhập nếu điều kiện.

nếu điều trên không giúp bạn thực hiện việc này.

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

Điều này sẽ tách tất cả trình xử lý nhấp và sự kiện khỏi phần tử và liên kết lại.

+0

Cảm ơn. Đó có thể là một giải pháp đơn giản nhưng hiệu quả. Bạn có thể xác nhận liệu đây có phải là hành vi bình thường không? Tôi không mong đợi chức năng phía máy chủ của tôi được gọi lại.Tuy nhiên, nếu các cuộc gọi tiếp theo đến máy chủ của tôi đang diễn ra trong nội bộ từ Jquery, và không phải là một nút bấm, thì nó sẽ dừng lại? Tôi sẽ kiểm tra nó và xem. –

+0

Đây không phải là hành vi bình thường. '.get' chỉ nên được gọi khi người dùng nhấp vào nó. Tôi đoán những gì xảy ra là, bấm xử lý là nhận được thực hiện nhiều hơn một lần. – SachinGutte

+0

Tôi nghĩ rằng vấn đề không phải là với jQuery nhưng bấm xử lý. Bạn có thể đăng các mã html. – SachinGutte

Các vấn đề liên quan