假设我有一个函数fancyParse
,用于获取服务器返回的响应并将其转换为其他内容。如果响应没有任何意义,或者它设置了特殊的“内部错误”标志,则抛出此函数。
我想将此功能链接到$.post
调用以获取新的Deferred
。如果请求失败,或者fancyParse
抛出,则此新延迟将失败。如果请求成功并且fancyParse
成功,并且重要的是,将fancyParse
的结果传递给其成功回调,它将会成功。
完美的解决方案看起来像这样:
$.post('/url', etc).postprocess(fancyParse)
.done(my_done_handler)
.fail(my_fail_handler);
这样的事情是否已经可用,或者我是否需要自己编写这样的postprocess
?
答案 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);
});
答案 1 :(得分:3)
dataFilter
函数可用于处理数据。你传递了它的请求。
http://api.jquery.com/jQuery.ajax/
$.ajax({
...,
dataFilter: function (data, type) {
// do something with data and return it
return data.toLowerCase();
}
})