非同步js中的同步-Promise

因為測試的原因我不得不要學會關於Promise的相關知識啊~~ 偏偏中文相關文章又很少很難懂==~

Propagation

Promise 中 then return 的東西大有玄機,有三種情況
Promise: 下一個 then 會是一個全新的 Promise
Value: 這個 Promise 已經被滿足了,之後串接的 then 都會是此 Value
Throw exception: 這個 Promise 發生問題,之後的 then 都不會執行,會改執行 fail 的 callback

Chaining



就是上述第一點,可以改善 Callback Hell ,讓 nested 的 callback 少一點return getUsername() .then(function (username) { return getUser(username); // new promise }) .then(function (user) { });

Combination


當有多個 Promise ,而你想要等這些 Promise 都執行完(fulfilled),才要執行下一步的話,可以使用這個非常 awesome 的用法Promise.all([promiseA, promiseB, promiseC]).then(function () { console.log "A, B, C has done!" });

Handling Errors



除了 then 之外,還有 catch 的 method 來接 chaining 過程中有發生的 exception ,用 done() 會讓未處理的 exception 噴出來
Promise Creation


假設我們要把 readFile 包裝成 Promise ,可以這麼做var deferred = Promise.defer(); FS.readFile("foo.txt", "utf-8", function (error, text) { if (error) { deferred.reject(new Error(error)); } else { deferred.resolve(text); } }); return deferred.promise;



reslove 的值會 pass 到一個接 then 的, reject 會 pass 到 catch 。 這樣就可以輕鬆建立 Promise ,也可以用 when 來包裝單純 value
Summary


總結來說, Promise 提供了一套抽象化的方法,來處理 Async Code ,讓 Async Code 可以更好管理。今天會想寫這篇是因為看到這篇介紹, Promise 要正式登場,之後就可以原生使用這功能拉,大家快來熟悉一下,這看似困難卻又非常優雅的 Design 。


這邊的範例都是從 Q 截取而來。

留言

這個網誌中的熱門文章

postman有跨網域神力啊

angular ui-router 變更網址列的方式! (偷渡關於移除URL中的#

google smtp好麻煩啊~