Đoạn mã này hoạt động trong 1.7.2 với cả lời gọi lại thành công/lỗi cũng như lời hứa gọi lại kiểu gọi lại. Với 1.8.2 callbacks thành công/error vẫn làm việc nhưng những lời hứa không. Linh cảm của tôi là dòng return dfd.promise(jqXHR);
là vấn đề nhưng tôi không chắc chắn.Lời hứa của tôi không còn hoạt động trong jQuery 1.8
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
// Don't infinitely recurse
originalOptions._retry = isNaN(originalOptions._retry)
? Common.auth.maxExpiredAuthorizationRetries
: originalOptions._retry - 1;
// set up to date authorization header with every request
jqXHR.setRequestHeader("Authorization", Common.auth.getAuthorizationHeader());
// save the original error callback for later
if (originalOptions.error)
originalOptions._error = originalOptions.error;
// overwrite *current request* error callback
options.error = $.noop();
// setup our own deferred object to also support promises that are only invoked
// once all of the retry attempts have been exhausted
var dfd = $.Deferred();
jqXHR.done(dfd.resolve);
// if the request fails, do something else yet still resolve
jqXHR.fail(function() {
var args = Array.prototype.slice.call(arguments);
if (jqXHR.status === 401 && originalOptions._retry > 0) {
// refresh the oauth credentials for the next attempt(s)
// (will be stored and returned by Common.auth.getAuthorizationHeader())
Common.auth.handleUnauthorized();
// retry with our modified
$.ajax(originalOptions).then(dfd.resolve, dfd.reject);
} else {
// add our _error callback to our promise object
if (originalOptions._error)
dfd.fail(originalOptions._error);
dfd.rejectWith(jqXHR, args);
}
});
// NOW override the jqXHR's promise functions with our deferred
return dfd.promise(jqXHR);
});
Cập nhật: Đây là yêu cầu ajax của tôi thất bại:
$.ajax({
url: someFunctionToGetUrl(),
// works
//success: callback,
//error: ajaxErrorHandler
}).then(
[callback],
[errorback, ajaxErrorHandler]
);
};
Yêu cầu của bạn có đồng bộ không? Nếu vậy, nó sẽ không hoạt động với 'jqXHR'. Từ tài liệu: "Kể từ jQuery 1.8, việc sử dụng async: false với jqXHR ($ .Deferred) không còn được dùng nữa; bạn phải sử dụng lệnh gọi lại thành công/thành công/lỗi". – bfavaretto
Không, đã thêm yêu cầu ajax của tôi vào bài đăng – ryan
Bạn có quen với trình gỡ lỗi Chrome không? >. < Bài đăng của bạn có thể được trả lời bởi những người: 1 có thể làm việc với cùng một thứ chính xác (hoặc thực hiện nghiên cứu). 2 có sự kiên nhẫn và sẽ thiết lập một ví dụ để điều tra.Vì vậy, nếu bạn cung cấp một câu trả lời nó sẽ là hữu ích. – EricG