Có bất kỳ tương tự nào cho 'cuối cùng' trong các lệnh gọi jQuery AJAX không?


83

Có một tương tự Java 'cuối cùng' trong các lệnh gọi jQuery AJAX không? Tôi có mã này ở đây. Trong tôi luôn tôi ném một ngoại lệ, tuy nhiên tôi luôn luôn muốn nó đi đến đó () phương pháp.

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

Tôi đã cố gắng sử dụng done () , complete () và cái khác luôn luôn () , nhưng dường như không có gì hoạt động.

Đây là JSFiddle:

http://jsfiddle.net/qv3t3L0m/


chỉ thêm nó vào always...
David Fregoli

1
Bạn không thể bắt gặp các lỗi được ném ra không đồng bộ, đó là những gì bạn đang tìm kiếm. Bạn sẽ cần phải tự mình gói nó thành một try-catch-finallytuyên bố.
Bergi

3
luôn chuyển đến hàm always (), đó là lý do tại sao nó được đặt tên rất hợp lý.
adeneo

Trừ khi jQuery xử lý mọi lần thử / bắt trong một lệnh gọi lại, throw "something";nếu không thì việc thực thi mã sẽ chỉ dừng lại.
plalx

@Bergi, tôi không quen với việc tích hợp các lời hứa của jQuery, nhưng nếu nó tuân thủ Promises / A +, thì các lỗi được đưa ra sẽ được chuyển đến một errorHandler được chuyển đến sau đó. Vì vậy, nếu anh ta chuyển một hàm thứ hai đến sau đó, hàm đó sẽ nhận "cái gì đó" làm tham số.
David McMullin

Câu trả lời:


130

Xem ví dụ này:

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

Để biết thêm thông tin: http://api.jquery.com/jquery.ajax/


27
.complete()đã không được dùng nữa; sử dụng .always()ngay bây giờ. api.jquery.com/jQuery.ajax
mlg

4
Thích cho FUNFAR động từ: D
Bruno Rodrigues

4
@mlg: tham số hoàn thành không bị phản đối, họ chỉ không dùng nữa .complete () gọi lại, vì bây giờ các đối tượng jqXHR triển khai giao diện Promise. Xem câu trả lời cho câu hỏi này: stackoverflow.com/questions/15821141/...
jeanie77

45

.always()nên làm việc. Xem phần Đối tượng jqXHR tại http://api.jquery.com/jQuery.ajax/ .

jqXHR.always (function (data | jqXHR, textStatus, jqXHR | errorThrown) {}); Một cấu trúc thay thế cho tùy chọn gọi lại hoàn chỉnh, phương thức .always () thay thế phương thức .complete () không dùng nữa.

Để phản hồi một yêu cầu thành công, các đối số của hàm giống như đối số của .done (): data, textStatus và đối tượng jqXHR. Đối với các yêu cầu không thành công, các đối số giống như đối số của .fail (): đối tượng jqXHR, textStatus và errorThrown. Tham khảo deferred.always () để biết chi tiết triển khai.

Xem thêm http://api.jquery.com/deferred.always/


11

Các đề xuất dưới đây sẽ không hoạt động trong jQuery, bởi vì việc triển khai hứa hẹn của jQuery không xử lý các lỗi được đưa ra trong các phương thức được chuyển đến sau đó. Tôi chỉ để lại chúng ở đây như một minh họa về những gì có thể xảy ra nếu jQuery được hứa hẹn / tuân thủ A +. Như Bergi đã chỉ ra một cách đúng đắn, bạn sẽ phải tự gói mã của mình trong khối try catch của riêng bạn.

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Mặc dù tôi không chắc liệu lời hứa của jquery có hỗ trợ luôn không, nhưng một giải pháp thay thế sẽ là sử dụng then (một lần nữa) và chuyển cùng một hàm như cả successHandler và errorHandler, như thế này:

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});

jQuery's thenkhông bắt lỗi trong lệnh gọi lại. Đã bạn thử loại này?
Bergi

xin lỗi, tôi đã thử sử dụng then-> always, và có hai chức năng trong then của tôi, nhưng tôi vẫn gặp sự cố tương tự.
Oliver Watkins

xin chân thành xin lỗi, sau khi xem các tài liệu bị hoãn lại của jquery, tôi nghĩ điều này sẽ thành công, nhưng rõ ràng là tôi đã nhầm và Bergi đã chỉ ra đúng rằng tôi nên đăng ký trong hộp cát.
David McMullin

3

Chỉ là một lưu ý cho những người sử dụng jQuery 3.0 trở lên

Thông báo ngừng sử dụng: Các lệnh gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () đã bị xóa kể từ jQuery 3.0. Thay vào đó, bạn có thể sử dụng jqXHR.done (), jqXHR.fail () và jqXHR.always ().

Như trong tài liệu chính thức


2

Có một lỗi ajax là phụ thuộc vào máy chủ, cần kiểm tra trạng thái với "hoàn thành" là tốt nhất, một loại là "thành công", "lỗi" và những cái khác không 100% là PUT, POST và GET ... nhìn tại một ví dụ

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

Xin lỗi tiếng anh tệ! Vui lên ;-)


1

nếu bạn muốn một định nghĩa mã cho tất cả các yêu cầu ajax, bạn có thể làm như thế này

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.