Generators land on NodeJS

最近看到推上有不少人提到隨著v8登陸nodejs上的新功能 - Generators。據說在python、ruby上早已經有相似的功能,不過因為我都不熟所以還是不清楚(炸

根據規範上給的定義:

First-class coroutines, represented as objects encapsulating suspended execution contexts (i.e., function activ ations).

function* loop(x) {  
    for(var i = 0; i < 100; i++) {
        x = x * 2;
        yield x;
    }
}
var b = loop(2);  
b.next();   // 4  
b.next();   // 8  

這是一個極簡單的範例,大概就可以看出它的基本特性 - 利用function*的方式宣告Generators,然後新定義的yield則類似中斷點一樣,配合next()send(),可以取出/回傳數值。

另外也可以搭配for of的方式來做到類似for in迭代器的效果。

本來想說只是es6裡面新的功能而已,不過後來發現有些強者開始動手寫了一些模組出來,才發現原來事情不像我想的這麼簡單。Generators的特性可以用來解決長久以來的JS問題 - callback hell。其實說這是問題有點太過了,不過主要是程式的結構會變得很雜亂:

func1(err, function(data)) {  
    func2(err, data, function(data1)) {
        func3(err, data1, function(data2)) {
            // do your staff
        });
    });
});

就可以改成同步的方式來撰寫

function* newStyle() {  
    var data1 = yield func1();
    var data2 = yield func2(data1);
    var data3 = yield func3(data2);
}

也可以參考這篇文章,裡面有對於Generators之於Javascript的影響有更深入的介紹: Javascript's Future: Generators

目前nodejs穩定版也還沒辦法使用這個方式,必須切換到0.11.x的版號,然後記得帶上--harmony的參數就可以使用,已經有不少專案開始出現了,有興趣的也可以去玩玩看。還沒有很能掌握其特性,不過可能拿來搭配Promise來使用,因為都是偏向使用同步的撰寫來取代一堆回呼,等玩熟之後再補一篇心得吧(希望(炸

Ferrari Lee

Read more posts by this author.

Subscribe to Ferrari != Ferrari

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!