2009-06-20 26 views
20

Tôi muốn hiểu lời gọi AJAX bên dưới, về phương pháp complete();Sử dụng thành công() hoặc hoàn thành() trong cuộc gọi AJAX

Khi tôi thay complete() với success(), tôi nhận được một sản phẩm nào responseText cũng giống như với phương pháp AJAX error().

Mặt khác, khi tôi rời phương thức complete() ở đó, mọi thứ hoạt động như mong đợi.

Có phải là success() trả về sớm hơn complete()?

$("#formnaw").submit(function() { 
    var fnc = invoerFnc.attr("value"); 
    var vnaam = invoerVnaam.attr("value"); 
    var anaam = invoerAnaam.attr("value"); 
    var str1 = invoerStr1.attr("value"); 
    var nr1 = invoerNr1.attr("value"); 
    var pc1 = invoerPc1.attr("value"); 
    var pl1 = invoerPl1.attr("value"); 
    var tel1 = invoerTel1.attr("value"); 
    var mob1 = invoerMob1.attr("value"); 
    var em1 = invoerEm1.attr("value"); 
    var goknop = $("#formnaw > .instelling_go"); 
    //we deactiveren de submit knop tijdens het verzenden 
    goknop.attr({ 
    disabled: true 
    }); 
    goknop.blur(); 
    //stuur de post variabelen naar livetabs.php 
    $.ajax({ 
    type: "POST", 
    url: "registraties/instellingenact.php", 
    data: "actie=wijzignaw&vnaam=" + vnaam + "&anaam=" + anaam + "&functie=" + fnc + "&straat=" + str1 + "&nr=" + nr1 + "&postcode=" + pc1 + "&plaats=" + pl1 + "&tel=" + tel1 + "&mob=" + mob1 + "&email=" + em1, 
    timeout: 5000, 
    success: function(data, textStatus) { 
     alert('bij success'); 
     //doe iets 
     } //EINDE success 
     , 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     if (textStatus == 'timeout') { 
      //doe iets 
     } else if (textStatus == 'error') { 
      //doe iets 
     } 
     //her-activeer de zend knop 
     goknop.attr({ 
      disabled: false 
     }); 
     } //EINDE error 
     , 
    complete: function(data) { 
     updatelijst.append(data.responseText + "<br>"); 
     if (data.responseText.indexOf("Fout") != -1) { 
      $('#formnaw').find('td.foutnr1').prepend(data.responseText); 
     } else { 
      updatelijst.animate({ 
      opacity: 'show' 
      }, 1000, function() {}); 
     } 
     //her-activeer de zend knop 
     goknop.attr({ 
      disabled: false 
     }); 
     } //EINDE complete 
    }); //EINDE ajax 
    //we stoppen het standaard gedrag van een submit, zodat de pagina niet wordt vernieuwd. 
    return false; 
}); 

Trả lời

12

"hoàn thành" sẽ thực thi khi cuộc gọi ajax kết thúc. "thành công" thực hiện khi cuộc gọi ajax kết thúc bằng mã phản hồi thành công.

+0

cảm ơn, nhưng để rõ ràng, tôi có phải sử dụng mã để thực thi theo một tùy chọn hoàn chỉnh và không thành công hay không. Và tùy chọn lỗi cũng sẽ làm việc với tùy chọn hoàn chỉnh một mình? –

+0

hoặc, nó cho thấy rằng tôi không nhận được một sự thành công responsecode, lạ? –

35

complete thực hiện sau khi cuộc gọi lại success hoặc error được thực hiện.

Có thể bạn cũng nên kiểm tra tham số thứ hai complete. Đó là một String giữ kiểu thành công mà ajaxCall có.

Các callbacks khác nhau được mô tả nhiều hơn một chút chi tiết ở đây jQuery.ajax(options)


Tôi đoán bạn bỏ lỡ một thực tế là completesuccess chức năng (Tôi biết API không phù hợp) có được dữ liệu khác nhau thông qua vào. success được chỉ dữ liệu, complete nhận toàn bộ đối tượng XMLHttpRequest. Tất nhiên không có thuộc tính responseText trên chuỗi dữ liệu.

Vì vậy, nếu bạn thay thế complete bằng success bạn cũng phải thay thế data.responseText chỉ với data.

thành công

Chức năng được thông qua hai lập luận: Các dữ liệu trả về từ máy chủ , định dạng theo tham số 'datatype', và một chuỗi mô tả các trạng thái.

hoàn

Chức năng được thông qua hai lập luận: Các đối tượng XMLHttpRequest và một chuỗi mô tả các loại thành công của yêu cầu.

Nếu bạn cần truy cập vào toàn bộ đối tượng XMLHttpRequest trong gọi lại thành công, tôi khuyên bạn nên thử tính năng này.

var myXHR = $.ajax({ 
    ... 
    success: function(data, status) { 
     ...do whatever with myXHR; e.g. myXHR.responseText... 
    }, 
    ... 
}); 
+0

oops, bình luận đến cùng một lúc Vì vậy, nếu tôi nhận được quyền này. Hàm đầy đủ chứa tất cả thông tin tôi cần. Thành công chứa ít trừ khi bạn vượt qua hai đối số trong hàm. Tôi hy vọng tôi không nhận được ngu ngốc, nhưng là hoàn toàn như tôi sử dụng sau đó không đủ tất cả các thời gian? Hay là thành công đó có trọng lượng nhẹ hơn không ?? –

+0

Ngoài cả nhận xét cuối cùng của tôi, mã của tôi từ phía trên vẫn còn bị lỗi. Tóm lại, nó sẽ làm mọi thứ mà không có bất kỳ hạn chế nào nếu tôi bỏ qua lựa chọn thành công. Xin lỗi nếu có vẻ như tôi chưa hiểu. Hơi khó hiểu với tôi. –

+0

Tôi đã chỉnh sửa câu hỏi của mình để chứa mã hoàn chỉnh mà tôi đã sử dụng Nó không đưa ra bất kỳ lỗi nào, nhưng tôi có thể cắt tùy chọn thành công. Nếu kết quả là như nhau. –

18

Là nó mà success() lợi nhuận sớm hơn complete()?

; phương thức AJAX success() chạy trước phương thức complete().

Dưới đây là một sơ đồ minh họa dòng chảy quá trình:

AJAX call process flow diagram.

Điều quan trọng cần lưu ý là

  • Các success() (tổ chức sự kiện địa phương) chỉ được gọi là nếu yêu cầu đã thành công (không có lỗi từ máy chủ, không có lỗi với dữ liệu).

  • Mặt khác, complete() (Sự kiện cục bộ) được gọi bất kể yêu cầu có thành công hay không. Bạn sẽ luôn nhận được một cuộc gọi lại đầy đủ, ngay cả đối với các yêu cầu đồng bộ.

... chi tiết về sự kiện AJAX here.

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