Deferred使用心得
前言
從Deferred出來,已經經過兩次大改版了,我都一直沒有去接觸他,驚覺這樣不行,必須好好了解一番, 拜見google老大,翻了幾篇文章,發覺這東西還真不賴,只要是非同步,不管是不是ajax都可以達到統一管理 之功效。
簡單介紹
Deferred物件,分成三種型態,resolved、rejected和pending,而Deferred物件改變狀態,必須認識這三種方法
| 方法名稱 | 說明 | 執行的函數 |
|---|---|---|
| resolve | 表示成功 | done() |
| reject | 表示失敗 | fail() |
| notify | 字面上是"通知"的意思,就是還未接收到成功或失敗,都可以使用此條件來表示進度。 | progress() |
notify這狀態條件是在1.7版增加,這方法不會停止Deferred物件,直到有resolve和reject為止才停止,因該是這樣,我使用感覺大概就是這樣。
Ajax與Deferred結合
$(function(){
$.when($.get("byajax001.asp"),$.get("byajax002.asp"))
.done(funDone)
.fail(funFail)
.always(funAlways);
});
var funDone = function(a1,a2){
//console.log($.type(a1));
var aData1 = a1;//[data, textStatus, jqXHR]
var aData2 = a2;//[data, textStatus, jqXHR]
$.map([a1,a2],function(e,i){
$.map(e,function(data,i){
switch(i){
case 0:
$(document.body).append("檔名:");
$(data).find("div").appendTo(document.body);
break;
case 1:
$(document.body).append("狀況:" + data + "
");
break;
case 2:
$(document.body).append("jqXHR:" + $.type(data) + "
")
break;
}
});
});
}
var funFail = function(a1,a2){
$("body").append("失敗")
}
var funAlways = function(){
var bDone = this.isResolved(),bFail = this.isRejected();
if(bDone){
console.log("成功插一腳");
}else if(bFail){
console.log("失敗插一腳");
}
}
$.when()方法可以很簡單,同步兩個ajax,並且取得數值。
一般非同步函數
jQuery範例寫得很清楚,直接使用一次就明白。
function asyncEvent(){
var dfd = new jQuery.Deferred();
// Resolve after a random interval
setTimeout(function(){
dfd.resolve("hurray");
}, Math.floor(400+Math.random()*2000));
// Reject after a random interval
setTimeout(function(){
dfd.reject("sorry");
}, Math.floor(400+Math.random()*2000));
// Show a "working..." message every half-second
setTimeout(function working(){
if ( dfd.state() === "pending" ) {
dfd.notify("working... ");
setTimeout(working, 500);
}
}, 1);
// Return the Promise so caller can't change the Deferred
return dfd.promise();
}
// Attach a done, fail, and progress handler for the asyncEvent
$.when( asyncEvent() ).then(
function(status){
alert( status+', things are going well' );
},
function(status){
alert( status+', you fail this time' );
},
function(status){
$("body").append(status);
}
);
// Existing object
var obj = {
hello: function( name ) {
alert( "Hello " + name );
}
},
// Create a Deferred
defer = $.Deferred();
// Set object as a promise
defer.promise( obj );
// Resolve the deferred
defer.resolve( "John" );
// Use the object as a Promise
obj.done(function( name ) {
obj.hello( name ); // will alert "Hello John"
}).hello( "Karl" ); // will alert "Hello Karl"
結語
使用過後,對pipe與then到底有什麼不一樣??rejectWith()到底在什麼情況可以使用到他,目前都還是很模糊,但基本上使用都不會有太大問題。