我可以手动解决延迟对象,如果回调可能需要拒绝呢?(Can I manually resolve a

2019-10-17 18:25发布

我试图用一个自定义的延迟对象来管理一些回调。 我已经想通了的简单的情况:

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

Answer 1:

好像你的目标实际上只是功能划分为不同的两个步骤:验证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);


文章来源: Can I manually resolve a deferred object if a callback might need to reject it?