jQuery中的Deferred和Promise有助于我们处理Ajax这样的异步过程,以jQuery中的\$.ajax()为例,当嵌套多个\$.ajax()异步函数时,代码就成了下面这样:
1 | $.ajax({ |
这种“金字塔”式的代码就是所谓的“回调地狱”。这种风格的代码使得调试变得很困难,使用jQuery中Promise
对象可以很好的处理这个问题。
使用Promise改写\$.ajax()回调
实际上,$.ajax()
返回的就是Promise
对象,如:
1 | var promise = $.ajax({url:'myUrl.do'}); |
我们也可以用then()
方法把done()
和fail()
合并到一起。
1 | promise.then(function(){ |
第一个参数表示done方法,第二个方法表示fail方法;如果只传递一个参数的话,就表示done方法。
所以,现在来改写一下上面的“金字塔”代码:
1 | var promise1 = $.ajax({url:"myUrl1.do"}); |
是不是好了很多?
jQuery中的$.when()
当多个Ajax请求都成功的时候,执行某个回调函数,这时候就可以使用$.when()
方法。如:
1 | $.when( |
在这个例子中,只有当两个Ajax请求都成功时,才会调用done方法。否则就调用fail方法。
$.Deferred()
$.Deferred().promise()
方法可以返回一个Promise对象。$.Deferred()
包含了三种状态:
pending:等待状态
resolved:成功(解决)状态
rejected:失败(拒绝)状态
默认的状态为pending,可以使用resolve和reject方法来改变状态:
1 | var deferred = $.Deferred(); |
或者:
1 | var deferred = $.Deferred(); |
当状态为rejected时,执行fail方法。当状态为resolved时,执行done方法。而always方法无论成功与失败都会执行。
例如,下面这个例子三秒后弹出success: