迄今為止,可能每個JavaScript開發者和他們的祖母都聽說過Promises。如果你沒有,那么你即將會。promises的概念是由CommonJS小組的成員在 Promises/A規范 中提出來的。Promises被逐漸用作一種管理異步操作回調的方法,但出于它們的設計,它們遠比那個有用得多。事實上,由于它們的多種用法,有無數人告訴我――在我寫過一些關于promises的東西后――我“遺漏了promises的重點”。那么什么是promises的重點呢?
一點關于Promises的東西
在我開始promise的“重點”之前,我想我應該給你一點它們如何工作的內貌。一個promise是一個對象――根據Promise/A規范――只需要一個方法:then。then方法帶有三個參數:一個成功回調,一個失敗回調,和一個前進回調(規范沒有要求包括前進回調的實現,但是很多都實現了)。一個全新的promise對象從每個then的調用中返回。
一個promise可以是三種狀態之一:未完成的,完成的,或者失敗的。promise以未完成的狀態開始,如果成功它將會是完成態,如果失敗將會是失敗態。當一個promise移動到完成態,所有注冊到它的成功回調將被調用,而且會將成功的結果值傳給它。另外,任何注冊到promise的成功回調,將會在它已經完成以后立即被調用。
同樣的事情發生在promise移動到失敗態的時候,除了它調用的是失敗回調而不是成功回調。對包含前進特性的實現來說,promise在它離開未完成狀態以前的任何時刻,都可以更新它的progress。當progress被更新,所有的前進回調(progress callbacks)會被傳遞以progress的值,并被立即調用。前進回調被以不同于成功和失敗回調的方式處理;如果你在一個progress更新已經發生以后注冊了一個前進回調,新的前進回調只會在它被注冊以后被已更新的progress調用。
我們不會進一步深入promise狀態是如何管理的,因為那不在規范之內,而且每個實現都有差別。在后面的例子中,你將會看到它是如何完成的,但目前這就是所有你需要知道的。
處理回調
像前面提到的為異步操作處理回調,是promises的最基本和最普通的用途,讓我們將一個標準的回調與一個采用了promise的回調比較一下。
// Normal callback usageasyncOperation(function() { // Here's your callback});// Now `asyncOperation` returns a promiseasyncOperation().then(function(){ // Here's your callback});
我很懷疑只是看到這個例子的話是否有人會真的關心去使用promises??雌饋頉]有什么好處,除了“then”使得在異步操作完成之后的回調函數被調用這件事看起來更加明顯。但是即使是這個好處,我們現在有了更多的代碼(抽象應該使我們的代碼更短,不是嗎?)而且promise比標準回調稍微性能差一點。
但是,不要讓這阻礙到你。如果這就是promise可以做的最好的事,這篇文章就不會存在了
厄運的金字塔
// Normal callback usage => PYRAMID OF DOOOOOOOOMasyncOperation(function(data){ // Do some processing with `data` anotherAsync(function(data2){ // Some more processing with `data2` yetAnotherAsync(function(){ // Yay we're finished! }); });});// Let's look at using promisesasyncOperation().then(function(data){ // Do some processing with `data` return anotherAsync();}).then(function(data2){ // Some more processing with `data2` return yetAnotherAsync();}).then(function(){ // Yay we're finished!});
正如你所見,promises的使用使得事情變扁平而且更可讀了。這能起作用是因為――像早先提到的――then返回了一個promise,所以你可以將then的調用不停的串連起來。由then返回的promise裝載了由調用返回的值。如果調用返回了一個promise(像這個例子中的情形一樣),then返回的 promise裝載了與你的回調返回的promise所裝載的相同值。這內容很多,因此我將幫助你一步一步的理解它
新聞熱點
疑難解答