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

时间:2013-02-26 18:17:59

标签: 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()的第一个参数,但这似乎忽略了延迟对象的意义 - 我认为它们是用于将所有这些行为封装到一个地方。 / p>

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

1 个答案:

答案 0 :(得分:3)

看起来你的目标实际上只是将功能分成两个步骤:验证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);