【发布时间】:2012-10-17 14:06:32
【问题描述】:
此代码 sn-p 在 1.7.2 中使用成功/错误回调以及承诺样式回调。在 1.8.2 中,成功/错误回调仍然有效,但 Promise 无效。我的直觉是return dfd.promise(jqXHR); 行是问题,但我不确定。
$.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);
});
更新:这是我的 ajax 请求失败:
$.ajax({
url: someFunctionToGetUrl(),
// works
//success: callback,
//error: ajaxErrorHandler
}).then(
[callback],
[errorback, ajaxErrorHandler]
);
};
【问题讨论】:
-
您的请求是否同步?如果是这样,它将不适用于
jqXHR。来自文档:“从 jQuery 1.8 开始,不推荐使用 async: false 和 jqXHR ($.Deferred);您必须使用完整/成功/错误回调。” -
不,在帖子中添加了我的 ajax 请求
-
您熟悉 Chrome 调试器吗? >.
-
我会尽快找到答案
标签: javascript ajax jquery jquery-deferred