function fn(nums) {
return new Promise(resolve => {
setTimeout(() => {
resolve(nums * 2)
}, 1000)
})
}
function* gen() {
const num1 = yield fn(1)
const num2 = yield fn(num1)
const num3 = yield fn(num2)
return num3
}
function generatorToAsync(generatorFn) {
return function () {
const gen = generatorFn.apply(this, arguments)
return new Promise((resolve, reject) => {
function go(key, arg) {
let res
try {
res = gen[key](arg)
} catch (error) {
return reject(error)
}
const { value, done } = res
if (done) {
return resolve(value)
} else {
return Promise.resolve(value).then(val => go('next', val), err => go('throw', err))
}
}
go("next")
})
}
}
const genToAsync = generatorToAsync(gen)
const asyncRes = genToAsync()
console.log(asyncRes)
asyncRes.then(res => console.log(res))
console