2

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

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

完美的解决方案如下所示:

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

像这样的东西已经可用,还是我需要自己写这样的东西postprocess

4

2 回答 2

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/

于 2011-09-14T12:15:19.987 回答
3

dataFilter函数可用于处理数据。您将其与您的请求一起传递。

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

$.ajax({
    ...,
    dataFilter: function (data, type) {
        // do something with data and return it
        return data.toLowerCase();
    }
})
于 2011-09-13T18:34:32.053 回答