/**
* generator的精華在於next的參數,這樣的能力才讓generetor成爲了一種強悍的流程能力
*/
function mypromise() {
return Promise.resolve({x: 1})
}
function* mygen() {
var data = yield mypromise()
console.log(data)
return data
}
var x = mygen()
var y = x.next()
// 利用next(data)的特性可以將generetor中的promise展開,直接更改yeild執行上下文的返回變量值
// 這個技巧被用在mobx-state-tree中的flow上
y.value.then(data => {
x.next(data)
})
// 實現一個flow
function flow(gen, args) {
let _gen = gen(args);
function _next(h) {
if (h.done) {
console.log('flow end!!')
return h.value;
}
if (h.value instanceof Promise) {
h.value.then(res => {
_next(_gen.next(res))
})
} else {
_next(_gen.next(h.value))
}
}
return _next(_gen.next())
}
function* chains(){
var data1 = yield Promise.resolve({x: "flow1"})
console.log('data1: ', data1)
var x = data1.x;
console.log('x: ', x)
var data2 = yield x + " ==> flow2";
console.log('data2: ', data2)
return data2
}
// 執行這個flow, 有意思的事情來了
flow(chains)
js generator妙用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.