generator、co模塊和async三者的區別

generator


特色

  1. function*
  2. 可使用yield返回屢次

調用方法

  1. 使用next()執行generator代碼,每次遇到yield就返回一個對象{ value: x, done: true/false }, 若是donetrue,則value就是return的返回值,沒有return就返回undefined,若是return語句後面還有yield,這個generator對象就所有執行完成,不要再繼續調用next()
  2. 直接用for ... of循環迭代generator對象,這種方式不須要咱們本身判斷done
for (var x of fib(5)) {
    console.log(x); // 依次輸出0, 1, 1, 2, 3
}
  1. 若是給next方法傳參數, 那麼這個參數將會做爲上一次yield語句的返回值
function* foo(x) {
    var y = 2 * (yield (x + 1));
    var z = yield (y / 3);
    return (x + y + z);
}

var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}

var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }

做用

  1. ajax的異步處理
function* main() {
    var result = yield request("http://www.filltext.com?rows=10&f={firstName}");
    console.log(result);
    //do 別的ajax請求;
}

co模塊


模塊思路

co 模塊的思路就是利用 generator 的這個特性,將異步操做跟在 yield 後面,當異步操做完成並返回結果後,再觸發下一次 next() 。固然,跟在 yield 後面的異步操做須要遵循必定的規範 thunks 和 promises。javascript

function co(gen) {
    var it = gen();
    var ret = it.next();
    ret.value.then(function(res) {
        it.next(res);
    });
}
function sayhello() {
    return Promise.resolve('hello').then(function(hello) {
        console.log(hello);
    });
}
co(function *helloworld() {
    yield sayhello();
    console.log('world');
});

async優勢

  1. 內置執行器。 Generator 函數的執行必須靠執行器,因此纔有了 co 函數庫,而 async 函數自帶執行器。也就是說,async 函數的執行,與普通函數如出一轍,只要一行。
  2. 更好的語義。 async 和 await,比起星號和 yield,語義更清楚了。async 表示函數裏有異步操做,await 表示緊跟在後面的表達式須要等待結果。
  3. 更廣的適用性。 co 函數庫約定,yield 命令後面只能是 Thunk 函數或 Promise 對象,而 async 函數的 await 命令後面,能夠跟 Promise 對象和原始類型的值(數值、字符串和布爾值,但這時等同於同步操做)。

Express 和 Koa 的區別


Express

優勢:線性邏輯,經過中間件形式把業務邏輯細分、簡化,一個請求進來通過一系列中間件處理後再響應給用戶,清晰明瞭。
缺點:基於 callback 組合業務邏輯,業務邏輯複雜時嵌套過多,異常捕獲困難。java

Koa

優勢:首先,藉助 co 和 generator,很好地解決了異步流程控制和異常捕獲問題。其次,Koa 把 Express 中內置的 router、view 等功能都移除了,使得框架自己更輕量。
缺點:社區相對較小。ajax

相關文章
相關標籤/搜索