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

标签 javascript jquery

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

相关文章:

javascript - Jquery 未定义条件不起作用

javascript - 按数字突出显示字符

javascript - 如何使用javascript根据当前时间创建一串数字?

javascript - Vue 3 - 发出不是一个函数

javascript - div滚动的无限循环

javascript - 自动测量功能时间

javascript - 在 Framework7 中的页面加载时显示/隐藏预加载器

javascript - 如何使用 MongoDb/Mlab 将应用程序部署到 heroku

jquery - 图片宽度错误

javascript - jQuery - 打开 div onLoad