jquery - 如果回调可能需要拒绝延迟对象,我可以手动解析它吗?

标签 jquery jquery-deferred

我正在尝试使用自定义延迟对象来管理一些回调。我已经弄清楚了简单的情况:

var deferred = $.Deferred();

deferred.done(function() {
    console.log( 'done' );
});

var json = $.getJSON('/foo');

json.then(
    function() {
        deferred.resolveWith(this, arguments);
    }  
);

但我需要在解决/拒绝之前检查响应。我想添加这样的内容:

deferred.pipe(
    function(response) {
        if (response.message === 'error') {
            return $.Deferred.reject(response);
        }
        return response;
    }
);

但是当我这样做时,无论如何都会调用我原来的 done() 回调。我很确定这是因为一旦我调用 deferred.resolveWith() 就太晚了,无法“回滚”并将其标记为稍后拒绝。我知道我可以将条件移到 json.then() 的第一个参数中,但这似乎错过了延迟对象的要点——我认为它们是为了封装所有这些行为集中到一个地方。

是否可以将条件和回调都放入 deferred 中,同时仍然在其他地方解决它?

最佳答案

看来您的目标实际上只是将功能分为两个步骤:验证 ajax 请求的结果,然后处理结果。为此,需要使用一个外部延迟,然后将其替换为内部延迟,该内部延迟根据 ajax 请求返回的参数进行解析或拒绝。

var deferred = $.Deferred();

deferred.then(function(data){
    // new deferred that we will be returning
    var deferred = $.Deferred();
    if (data.success == true) {
        deferred.resolveWith(data.result);
    }
    else {
        deferred.rejectWith(data.error);
    }
    // any following chained methods will affect this returned deferred object
    return deferred;
}).then(
    // done callback
    function(result){
        console.log("Resolved!");
        console.dir(result);
    },
    // fail callback
    function(error){
        console.log("Rejected!");
        console.dir(error)
    }
);

var json = $.getJSON("/foo");
json.done(deferred.resolveWith);

关于jquery - 如果回调可能需要拒绝延迟对象,我可以手动解析它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096350/

相关文章:

javascript - 在多个部分滚动导航到 h2

javascript - Jquery.deferred 的语法,使同步函数返回 promise

javascript - 表单验证不适用于多步骤表单

javascript - JS 不适用于 mustacheJS 的产品?

javascript - 等到 promise 和 nested then 完成

jquery - 使用 jQuery 延迟链接异步函数不会等待第一个函数完成

javascript - Jquery 延迟来自每个循环的 ajax 请求

javascript - Backbone.js 在获取返回值后呈现 View

javascript - 如何提醒 var distance_all (来自 var distance_top + distance_bottom)?

javascript - 根据该键内数组中的值查找键的值