2011-09-13 44 views
2

假设我有打算采取由服务器返回的响应,并把它变成别的东西的功能fancyParse。如果响应没有任何意义,或者设置了特殊的“内部错误”标志,则此函数会抛出。最简单的方式后处理jQuery ajax请求的结果?

我想将此功能链接到$.post调用以获得新的Deferred。如果请求失败,或者如果fancyParse抛出,这个新的延迟将失败。如果请求成功,fancyParse成功,它会成功,重要的是,将通过的fancyParse其成功回调的结果。

完美的解决方案将是这个样子:

$.post('/url', etc).postprocess(fancyParse) 
    .done(my_done_handler) 
    .fail(my_fail_handler); 

是这样已经上市,或者我需要写一个这样的postprocess自己?

回答

2

dataFilter功能可以用来处理数据。你把它传递给你的请求。

http://api.jquery.com/jQuery.ajax/

$.ajax({ 
    ..., 
    dataFilter: function (data, type) { 
     // do something with data and return it 
     return data.toLowerCase(); 
    } 
}) 
+0

的文档没有说明这一点,但也许你知道:做过滤功能异常导致请求被视为失败? –

+0

对不起,我不知道。但是,为什么你不捕获异常,然后从你的后处理器中调用错误处理程序? – jbasko

+0

因为除了调用错误处理函数外,还有更多。我还需要'Deferred'成为*被拒绝*,以便随后添加的任何错误处理程序也被调用。 –

4

你可以创建你自己的递延对象:

$.postProcess = function(addr,test) { 
    var dfd = $.Deferred();   // create deferred object 
    $.post(addr)     // make ajax call 
    .success(function(response) { // if ajax is OK 
    if (test) {     // Your filter test 
     dfd.resolve("OK");   // if test is passed, call done() 
    } else { 
     dfd.reject("Bad test");  // otherwise call reject 
    } 
    }) 
    .error(function() {    // on ajax error 
    dfd.reject("Error");   // reject 
    }); 
    return dfd.promise();      // return deferred object 
}; 

//$.postProcess('/echo/json/',true) // to test good case 
//$.postProcess('/echo/json/',false) // to test bad test 
$.postProcess('/echo/error/',true) // to test bad ajax 
.done(function(msg){ 
    alert('ok:'+msg); 
}) 
.fail(function(msg){ 
    alert('fail:'+msg); 
}); 

http://jsfiddle.net/bouillard/FRsjV/

+0

感谢您的努力,我为此+1了。我想我会用它来记录我所想的其他东西,但对于后处理来说,'dataFilter'是完美的。 –

+0

是的,在这种情况下,datafilter应该比延迟更短。但延迟对于某些应用程序来说可能是一种非常方便的方式。谢谢。 –