最简单的方法来后处理jQuery ajax请求的结果?

时间:2011-09-13 18:31:49

标签: jquery jquery-deferred

假设我有一个函数fancyParse,用于获取服务器返回的响应并将其转换为其他内容。如果响应没有任何意义,或者它设置了特殊的“内部错误”标志,则抛出此函数。

我想将此功能链接到$.post调用以获取新的Deferred。如果请求失败,或者fancyParse抛出,则此新延迟将失败。如果请求成功并且fancyParse成功,并且重要的是,将fancyParse的结果传递给其成功回调,它将会成功。

完美的解决方案看起来像这样:

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

这样的事情是否已经可用,或者我是否需要自己编写这样的postprocess

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:3)

dataFilter函数可用于处理数据。你传递了它的请求。

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

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