如果失败,我似乎无法返回延迟对象。我有一个非常嵌套的 ajax 请求进入队列,所以我需要一种方法将请求作为延迟对象返回。如果请求成功,一切都很好,但我一直坚持传播失败。
https://jsfiddle.net/3wtady9r/
function doAjax(file) {
var defer = $.Deferred();
var fakeFile = file;
var data = null;
ajax();
function ajax() {
return $.get(fakeFile)
.done(function(data) {
data = data;
defer.resolve(data);
})
.fail(function() {
defer.fail();
})
}
return defer.promise(data);
}
var thisWillWork = '';
doAjax(thisWillWork)
.done(function() {
console.log('done')
})
.fail(function() {
console.error('fail')
})
.always(function() {
console.log('always')
})
var thisWontWork = 'fakeFile.html'
doAjax(thisWontWork)
.done(function() {
console.log('done')
})
.fail(function() {
console.error('fail')
})
.always(function() {
console.log('always')
})
当我执行 doAjax(thisWontWork) 时,我希望得到控制台错误以及 .always,但都不会触发。
最佳答案
那里有很多不同的问题。
你不想通过
data
进入defer.promise
在最后。你不想也不需要
data
变量,只是您在success
中收到的参数.因为您从不使用您从自己的
ajax
返回的值函数,无需返回。jQuery 的
ajax
already 返回一个 promise 来完成你的 promise 所做的事情,所以你的 promise 可以完全删除。这种情况经常发生there's an antipattern named for it . 每次你认为你需要做出 promise ,停下来想一想:我已经有了吗?当然,有时答案是否定的,但通常是肯定的。 :-)
从第 5 点开始,我们得到:
function doAjax(file) {
var fakeFile = file;
return $.get(fakeFile);
}
...这当然意味着您不需要 doAjax
完全。只需调用 $.get
.
但是如果出于某种原因你还没有分享你需要你自己的 promise ,那么只需点 1-4:
function doAjax(file) {
var defer = $.Deferred();
var fakeFile = file;
ajax();
function ajax() {
$.get(fakeFile)
.done(function(data) {
defer.resolve(data);
})
.fail(function() {
defer.reject();
});
}
return defer.promise();
}
关于javascript - 将延迟对象作为失败返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463285/