将延迟对象作为失败返回

Return a deferred object as a fail

本文关键字:失败 返回 延迟 对象      更新时间:2023-09-26

如果延迟对象失败,我似乎无法返回它。我有一个非常嵌套的 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 是一种在承诺被拒绝时调用处理程序的方法。要拒绝它,请使用 reject

  2. 您不想在最后将data传递到defer.promise

  3. 您根本不想要或不需要 data 变量,只需要您在 success 中收到的参数。

  4. 由于从不使用从自己的 ajax 函数返回的值,因此无需返回它。

  5. jQuery的ajax已经返回了一个承诺,它执行了你的承诺,所以你的承诺可以完全删除。这种情况经常发生,有一个反模式以它命名。當你認為你需要創造一個承諾時,停下來想:我已經有一個承諾嗎?当然,有时答案是否定的,但通常是肯定的。:-)

截至第 #5 点,我们最终得到:

function doAjax(file) {
    var fakeFile = file;
    return $.get(fakeFile);
}

。当然,这意味着您根本不需要doAjax。只需致电$.get.

但是,如果由于某种原因你没有分享你需要自己的承诺,那么只需第 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();
}

它应该是defer.reject();而不是defer.fail();

您也可以像在 defer.resolve(( 中一样在拒绝中添加数据。