day90-支持Promise的Generator Run

前言

专门处理。生成器yield出Promise,然后其控制生成器的迭代器来执行它,直到结束。


Photo by Johannes Krupinski on Unsplash

代码

function run (gen) {
let args = [].slice.call(arguments, 1), it
// 在当前上下文初始化生成器
it = gen.apply(this, args)
// 返回一个promise用于生成器完成
return Promise.resolve()
.then(function handleNext(value) {
// 对下一个yield出的值运行
let next = it.next(value)
return (function handleResult(next) {
// 生成器运行完毕了吗
if (next.done) {
return next.value
} else {
//否则继续运行
return Promise.resolve(next.value)
.then(
// 成功就恢复异步循环,把决议的值发回生成器
handleNext,
// 如果value是被拒绝的promise
// 就把错误传回生成器进行出错处理
function handleErr (err) {
return Promise.resolve(
it.throw(err)
)
.then(handleResult)
}
)
}
})(next)
})
}

应用

function *main() {
// ..
}
run(main)// 自动异步运行你传给它的生成器
文章作者: lmislm
文章链接: http://lmislm.com/2019/04/11/2019-04-11/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog