Javascript 我的承诺不再适用于jQuery1.8
此代码段在1.7.2中使用成功/错误回调以及promises样式回调。对于1.8.2,成功/错误回调仍然有效,但承诺不起作用。我的直觉是Javascript 我的承诺不再适用于jQuery1.8,javascript,ajax,jquery,jquery-deferred,Javascript,Ajax,Jquery,Jquery Deferred,此代码段在1.7.2中使用成功/错误回调以及promises样式回调。对于1.8.2,成功/错误回调仍然有效,但承诺不起作用。我的直觉是返回dfd.promise(jqXHR)行是问题,但我不确定 $.ajaxPrefilter(function (options, originalOptions, jqXHR) { // Don't infinitely recurse originalOptions._retry = isNaN(originalOptions._retry
返回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]
);
};
编辑:这是一个文档错误,但其行为是经过设计的。api更改为延迟。然后
现在的行为类似于,不再允许传入数组,但文档尚未更新以反映这一点
相关错误:
- github:
- jQuery Bug跟踪器:
我在下面原始答案末尾描述的解决方法仍然适用
原始答案:
在我看来,它像一个jQuery bug。如果将单个函数引用作为第一个参数传入,则它会起作用,但如果传入函数数组,则不会起作用:
但是,他说一组函数就可以了:
doneCallbacks解析延迟后调用的函数或函数数组
而且,你是对的。它确实适用于jQuery 1.7:
解决方法是将所有函数调用封装在单个函数中,而不是数组中:
$.ajax({
url: someFunctionToGetUrl(),
// works
//success: callback,
//error: ajaxErrorHandler
}).then(
function(){
callback1.apply(this, arguments);
callback2.apply(this, arguments);
},
[errorback, ajaxErrorHandler]
);
您可能需要对错误回调执行相同的操作,但我没有对此进行测试。您的请求是否同步?如果是这样,它将无法与jqXHR
一起工作。来自文档:“从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用complete/success/error回调。”否,在Postal中添加了我的ajax请求您熟悉Chrome调试器吗?>你的帖子可以由以下人员回答:1处理完全相同的事情(或进行研究)。2.有耐心和意愿树立一个榜样进行调查。所以,如果你能提供一个答案,那会很有帮助。我一找到答案就会提供