function run(genF) {
// 返回值是Promise
return new Promise((resolve, reject) => {
const gen = genF();
function step(nextF) {
let next;
try {
// 执行该函数获取一个有着value和done两个属性的对象
next = nextF();
} catch (error) {
reject(error)
}
// 判断是否到达末尾,Generator函数到达末尾则将该Promise变为fulfilled状态
if (next.done) {
return resolve(next.value);
}
// 没有到达末尾,则利用Promise封装value,直到执行完毕,反复调用setp函数,实现自动执行
Promise.resolve(next.value).then(v => {
step(() => gen.next(v))
}, e => {
step(() => gen.throw(e))
})
}
step(() => gen.next(undefined))
})
}