1

我正在做一个可以返回{status: ok}{status: error}与其他数据一起返回的 ajax 调用。

我想做一个.then(doneFilter)检查status成员然后修改的事情,这样延迟的现在只会在状态正常的情况下解决。

我不确定它的语法。有人可以给我写一个例子吗?

4

2 回答 2

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()andrejectWith()将上下文(一个this对象)传递给您的处理程序。

如果您还没有阅读延迟对象文档,我建议您阅读。

于 2013-01-30T17:14:37.047 回答
1

我认为您想修改 ajax deferred 本身以根据返回状态触发不同的回调。你不能因为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
   }
});
于 2013-01-30T17:27:55.490 回答