自己在尝试使用jquery的promise对象的时候,出现了这个问题:
var promise1 = someAjax(); //someFunction返回jq的jqxhr对象
var promise2 = promise1.then(function (data) {
return ajax1(); //返回jq的jqxhr对象
}, function (xhr) {
return ajax2(); //返回jq的jqxhr对象
});
promise2.then(function (data) {
// 我要怎么知道
// 到底是ajax1执行成功了
// 还是ajax2执行成功了?
}, function (xhr) {
alert("error");
});
如上代码所示,promise1成功之后,我希望它执行ajax1();promise1失败之后,我希望它执行ajax2()。但是promise2的话,无论是ajax1()成功了还是ajax2()成功了,它都会走到自己的success的分支里对吧。
我要如何区别呢?
自己问的问题,还是自己来答一下吧,看到还是有好几个人关注这个问题的。
在回答之前,我再加一个问题,是我在探索的时候遇到的。
也就是说,现在我们有两个问题。
问题一(我原本的问题):我想在执行某个ajax之后,成功的话,执行ajax1,失败的话,执行ajax2,那么如何分别对ajax1和ajax2的后续进行操作?
问题二(我追加的问题):我想在执行某个ajax之后,成功的话,执行ajax1和ajax2,那么如何分别对ajax1和ajax2的后续进行操作?
在stackoverflow上面,这个回答给了我启发,是的,使用
$.when()
和$.Deferred()
不废话,直接上代码。
解决问题一:
所以我的思路的原理是,首先声明一个
Deferred
对象,然后把这个对象传入到ajax
的函数里。如果success
,那么传入的Deferred
调用resolve()
方法,如果error
,那么传入的Deferred
调用reject()
方法。然后在程序中用$.when()
监听这个Deferred
对象,成功或失败,执行不同的指令。所以解决问题二,和问题一大同小异:
另外,如果ajax请求返回的json格式不对,即使status为200,$.ajax()也是会走到error的eventHandler里面的,这个要注意。至于什么样的格式是错的,反正我踩到的坑是是一个请求什么json都没返回,就走到error里面了。搞得我郁闷好几天,还以为自己写错了。