2 回答

TA貢獻1735條經驗 獲得超5個贊
你說的這段描述是對 jQuery(selector).promise()的描述,并不是 jQuery.Deferred() 的描述。
原文是:
1 | Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. |
而這段話是說:
1 | jQuery(selector).promise() 函數是返回一個 Promise 對象,這個對象的作用是當綁定到集合【也就是$( 'div' )這樣取到的集合】的指定類型的所有動作(promise方法的第一個參數 type ,默認是fx,也就是動畫)是否已經完成了。 |
英文水平有限,有些地方看不怎么懂,這話說得有點亂,不過意思應該是這樣的,舉個例子:
123456 | $( '#message' ) .animate({width:400, height:240}, 3000) .promise() .done( function (){ console.log( 'animate end' ); }); |
也可以寫成:
1234567 | $( '#message' ).animate({width:400, height:240}, 3000); var promise = $( '#message' ).promise(); promise.done( function (){ console.log( 'animate end' ); }); |
這里的 $('#message') 就是所說的collection,
而動畫 animate (即 fx)就是 certain type,
里面的所有動作就是 action queue,當然,這里只有1個,就是默認的fx (但是文檔中沒有找到介紹其它的類型)。
后面的 var promise = xxx 就是指返回的 Promise對象,這個對象在收到animate 方法里面的信號(這個信號包括 resolve, reject, notify, resolveWith, rejectWith, and notifyWith等)可以調用方法done(當然還有不少其它的方法,這里沒用到就不說了,自己看文檔吧),然后執行done的回調函數了。
animate方法會自己發送promise的信號,不用手動去處理。具體細節可以參考 jQuery.Deferred() 方法,在API的介紹中有這個方法的使用示例。
需要注意的是, jQuery(selector).promise()和jQuery.Deferred().promise()是不一樣的。
從目前我知道的來說,jQuery(selector).promise() 是專門用來處理jquery中的動畫(animate)使用的,而jQuery.Deferred().promise()使用的范圍更廣,沒看源碼,不過猜一下,我覺得 jQuery(selector).promise()是jQuery在動畫的時候對jQuery.Deferred().promise()的特殊實現(或者叫做功能封裝)。
然后再說一下jQuery.Deferred().promise()吧。它的一般用法為:
1234567 | var defer= $.Deferred(); $.when(defer.promise()).then<done|fail|....>(參數...) defer.resolve( '傳參數或留空' ); defer.reject( '傳參數或留空' ); defer.notify( '傳參數或留空' ); // ..... 其它信號 |
實例請自己去看API頁面。
上面的defer是一個延遲對象(deferred)引用,表示這個對象的信號會在將來發出。
接下來的 $.when(defer.promise()) 是指jQuery 要監視 defer的信號,收到信號后執行后面的then(或者done, fail或其它)的函數。而后面的defer.resolve<reject|notify>則是發出信號,通知jQuery延遲調用已經執行了,jQuery收到信號后,就去調用這個延遲的promise()后面的函數。
- 2 回答
- 0 關注
- 744 瀏覽
添加回答
舉報