在開發網頁時,常常會運用到一些非同步的功能,當功能執行完畢時,可能會呼叫某些函式。
例如Ajax就是大家比較常用到的,但是jQuery在Ajax的使用方面較為複雜(巢狀的結構),例如:
$.ajax({
url : "test.php",
success: function(msg){
alert(msg + " Tom");
}
});
因此jQuery設計了Deferred Object方便這方面的操作
Deferred Object建立
var deferred = $.Deferred();
//也可以建立帶參數的Deferred
var deferred = $.Deferred(function(deferred){
alert("Hello");
});
Deferred Object狀態
Deferred Object有三種狀態
- Pending:Operation 處理中
- Resolve:Operation 處理成功
- Reject:Operation 處理失敗
可以利用Deferred.state()查看現在狀態
//Pending alert(deferred.state()); //Resolve deferred.resolve(); alert(deferred.state()); //這裡得到的狀態還是Resolve,因為Deferred已經是處理完成狀態了,無法換成處理失敗狀態 deferred.reject(); alert(deferred.state());
Deferred Object使用方法
var deferred = $.ajax("test.php");
//當Ajax時動作完成時,可以同時執行多個動作
deferred.done(function(msg){
alert(msg + " Tom");
});
deferred.done(function(msg){
alert(msg + " John");
});
Deferred Object $.when()
//$.when的意思是,如果兩個ajax都成功,就會執行done,只要其中一個失敗,就會執行fail
//$.when的參數只接受Deferred物件
var deferred = $.when($.ajax("test.php"), $.ajax("test2.php"));
deferred.done(function(){
alert("成功");
});
deferred.fail(function(){
alert("失敗");
});
Deferred Object $.when() 陣列
//配合apply使用,當陣列的deferred物件都callback後才執行alert
$.when.apply(null,[$.getJSON("URL"),$.getJSON("URL"),$.getJSON("URL")]).then(function(){
alert("done");
});