function asyncTo(generator) {
const gen = generator()
return new Promise((resolve, reject) => {
function step(key, arg) {
let generatorResult
try {
generatorResult = gen[key](arg)
} catch (error) {
return reject(error)
}
const { value, done } = generatorResult
if (done) {
return resolve(value)
} else {
return Promise.resolve(value).then(val => step('next', val), err => step('throw', err))
}
}
step("next")
})
}
function* generator() {
let p1 = yield Promise.resolve('p1')
console.log('p1: ' + p1)
let p2 = yield Promise.resolve('p2')
console.log('p2: ' + p2)
return 3
}
asyncTo(generator).then(res => console.log(res))
console