1

我正在尝试使用自定义延迟对象来管理一些回调。我想出了一个简单的案例:

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,同时在其他地方解决它?

4

1 回答 1

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);
于 2013-02-27T18:09:15.050 回答