是時候用Deferred了
jQuery在1.5版本之后,引入了Deferred對象,提供的很方便的廣義異步機制。詳情可參看阮一峰老師的這篇文章http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html。
于是我用Deferred對象改寫了代碼,如下:
function getData3() {
var defer = $.Deferred();
$.ajax({
url: "p.php",
//async : false,
success: function(data) {
defer.resolve(data)
}
});
return defer.promise();
}
$(".btn3").click(function() {
$(".loadingicon").show();
$.when(getData3()).done(function(data) {$(".loadingicon").hide();
alert(data);
});
});
可以看到我在ajax請求中去掉了async:false,也就是說,這個請求又是異步的了。另外請注意success函數中的這一 句:defer.resolve(data),Deferred對象的resolve方法可傳入一個參數,任意類型。這個參數可以在done方法中拿到, 所以我們異步請求來的數據就可以以這樣的方式來返回了。
至此,問題得到了解決。Deferred對象如此強大且方便,我們可以好好利用它。