避免多層次回呼(Avoid Callback Hells)
跳過要捨棄的CallBack Hell不談,直接紀錄解法。
Promisification
Promise對象的概念:每個異步函式開始執行時就返回一個promise對象,而這個promise是"未來"這個函式返回值的代理(proxy),Promise的狀態有三:
- pending: Promise剛被初始化,無法得知代理的值。
- fulfilled: 操作成功,Promise所代理的值被滿足,調用.then()進行下一步。
- rejected: 意味操作失敗,在最後調用.catch()或.then()進行異常處理。
用途:讓Javascript捨棄多層Callback,每個函式都返回一個promise對象。以then()綁定一系列非同步操作,增加程式可讀性。
舉例來說:
function(arg)
.then(asyncFunc1)
.then(asyncFunc2)
.catch(func(err) {
console.log(err);
});
參考資料:MDN-Promise
Promise
Generator
在javascript中標記generator的方法是在關鍵字function後面上*作為modifier:
function* funcName(){
statement 1;
yield a;
statement 2;
yield b;
}
Generator本質上是物件,當Genetor函數被呼叫的時候並不會馬上返回一個值,而是返回一個Genertor:
var gen = funcNAme();
//Now gen is a generator!
這個Generator並不會馬上執行裡面的語句,而是等待每次gen.next()呼叫才會執行每段被yield分隔的語法並讓yield返回一個值,並且改變Generator的預設屬性done,以上述的例子來說:
var getValue = gen.next();
//statement 1被執行,a被返回指定給getValue。
//gen.done=false
var getValue = gen.next();
//statement 2被執行,b被返回指定給getValue
//gen.done=true,因為yield已經全部執行完畢。
var getValue = gen.next();
//node.js會告訴你發生錯誤:Error: Generator has already finished
參考資料:CodeData-初探 ES6(3)Generator
yield ( co 與 mz 套件)
mz
是下列library的wrapper,可以讓包裝過的函式產生Promise。
- child_process
- crypto
- dns
- fs
- readline
- zlib
co
generator async control flow goodness
co(func())會產生一個func返回值的promise。
Async (Async 套件)
Refenence:http://caolan.github.io/async/