gpt4 book ai didi

javascript - 将延迟对象作为失败返回

转载 作者:行者123 更新时间:2023-11-30 12:05:06 24 4
gpt4 key购买 nike

如果失败,我似乎无法返回延迟对象。我有一个非常嵌套的 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,但都不会触发。

最佳答案

那里有很多不同的问题。

  1. fail 是一种连接处理程序以在 promise 被拒绝时调用的方法。要拒绝它,使用 reject .

  2. 你不想通过 data进入defer.promise在最后。

  3. 你不想也不需要 data 变量,只是您在 success 中收到的参数.

  4. 因为您从不使用您从自己的 ajax 返回的值函数,无需返回。

  5. 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com