避免多層次回呼(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 ( comz 套件)

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/

results matching ""

    No results matching ""