Deferred使用心得

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()到底在什麼情況可以使用到他,目前都還是很模糊,但基本上使用都不會有太大問題。