我正在进行ajax调用,可以返回{status: ok}
或{status: error}
以及其他数据。
我想做一个.then(doneFilter)
来检查status
成员,然后修改一些事情,只有当状态正常时,Deferred现在才会解决。
我不确定其语法。有人能给我写一个例子吗?
答案 0 :(得分: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()
和rejectWith()
将上下文(this
对象)传递给处理程序。
如果你还没有,我建议你阅读deferred object documentation。
答案 1 :(得分:1)
我认为您想要修改ajax延迟自身以根据返回状态触发不同的回调。你不能因为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
}
});