使用Deferred.then()将一些已解决的案例过滤为被拒绝的案例

时间:2013-01-30 17:00:56

标签: jquery jquery-deferred jquery-1.8

我正在进行ajax调用,可以返回{status: ok}{status: error}以及其他数据。

我想做一个.then(doneFilter)来检查status成员,然后修改一些事情,只有当状态正常时,Deferred现在才会解决。

我不确定其语法。有人能给我写一个例子吗?

2 个答案:

答案 0 :(得分:2)

这是一个典型的例子:

/*  Returns a deferred object.  It is resolved if the ajax call succeeded, and
    is rejected otherwise.
*/
function doAjaxThing() {
    var df = $.Deferred();
    $.ajax('http://someurl.org/path/whatever').done( function(data) {
        if('test for success here')
            df.resolve();
        else
            df.reject();
    }).fail( function() {
        df.reject();
    });

    return df;  
}

doAjaxThing().then( 
    function() { 'success!'; },
    function() { 'failure.'; }
);

重要的是,不仅要处理成功案例,还要处理失败案例。您的ajax调用有两种失败方式:请求返回{status: error}或请求本身因某种服务器错误而失败。

您还可以使用其他选项。您可以将解析/拒绝调用中的数据传递给处理程序。您还可以使用acceptWith()rejectWith()将上下文(this对象)传递给处理程序。

如果你还没有,我建议你阅读deferred object documentation

答案 1 :(得分:1)

我认为您想要修改ajax延迟自身以根据返回状态触发不同的回调。你不能因为Promise个对象只能被解析一次。看看这个例子:

var fai = $.Deferred();
fai.then(function () {
    fai.reject();
    console.log(fai.state());
}).done(function () {
    console.log(fai.state()); 
});
fai.resove();

http://jsfiddle.net/ExplosionPIlls/QreYY/

事件链将调用.resolve,然后调用.then回调。 .then来电.reject。但是,如果您运行此操作,您会看到.reject调用后的状态仍然“已解决”,会触发.done回调。

也就是说,如果你的ajax请求成功,它将被设置为.resolved状态,你无法撤消它。

相反,你可以做这样的事情,我认为这样更简单:

$.ajax(...).done(function (json) {
   if (json && json.status == 'ok') {
      //handle success right here
   }
   else {
      //handle failure right here
   }
});