我正在做一个可以返回{status: ok}
或{status: error}
与其他数据一起返回的 ajax 调用。
我想做一个.then(doneFilter)
检查status
成员然后修改的事情,这样延迟的现在只会在状态正常的情况下解决。
我不确定它的语法。有人可以给我写一个例子吗?
我正在做一个可以返回{status: ok}
或{status: error}
与其他数据一起返回的 ajax 调用。
我想做一个.then(doneFilter)
检查status
成员然后修改的事情,这样延迟的现在只会在状态正常的情况下解决。
我不确定它的语法。有人可以给我写一个例子吗?
这是一个典型的例子:
/* 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()
andrejectWith()
将上下文(一个this
对象)传递给您的处理程序。
如果您还没有阅读延迟对象文档,我建议您阅读。
我认为您想修改 ajax deferred 本身以根据返回状态触发不同的回调。你不能因为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
}
});