js generator妙用

/** * 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章