◆ もっと良いやり方がある気がする
◆ なんか微妙? 

ジェネレータって非同期を楽に使えるようになるとか聞いた気がするので yield で非同期処理をしてみます
var actions = [
function(next){
setTimeout(function(){
console.log(10)
next()
}, 1000)
console.log(1)
},
function(next){
setTimeout(function(){
console.log(20)
next()
}, 2000)
console.log(2)
},
function(next){
setTimeout(function(){
console.log(30)
next()
}, 3000)
console.log(3)
}
]

function*a(as){
while(1){
yield as.shift()
}
}

function next(g){
var fn = g.next().value
fn && fn(next.bind(null, g))
}

next(a(actions))
1
(ここでプログラムはいったん終了)
(1秒)
10
2
(2秒)
20
3
(3秒)
30

シンプルにできました
ジェネレータの関数では 最初に渡された非同期実行する関数リストを 1 つずつ取り出して返すだけです
next 関数では 毎回 yield で返される値を受け取って実行します
各非同期関数では 引数に渡される関数を終了時に実行します


next 関数をなくして ジェネレータ関数内で非同期関数を実行させます
その場合 非同期実行する関数が本当は非同期じゃなくて同期実行で 次を実行されると ジェネレータは実行中です とエラーがでるので setTimeout を通してここで非同期にしています
var actions = [
function(g){
setTimeout(function(){
console.log(10)
g.next()
}, 1000)
console.log(1)
},
function(g){
setTimeout(function(){
console.log(20)
g.next()
}, 2000)
console.log(2)
},
function(g){
setTimeout(function(){
console.log(30)
g.next()
}, 3000)
console.log(3)
}
]

function*a(as){
var g = yield
while(1){
yield setTimeout(function(){
var fn = as.shift()
fn && fn(g)
},0)
}
}
var g
(g = a(actions)).next()
g.next(g)
(ここでプログラムはいったん終了)
1
(1秒)
10
2
(2秒)
20
3
(3秒)
30

ジェネレータで非同期ってこんな感じ?と思いつきでやってみましたけど もっと良いやり方がありそうに思います