function co(fn) {
return new Promise(resolve => {
const gen = fn()
next()
function onFulled(value) {
next(value)
}
function next(val) {
const { done, value } = gen.next(val)
if (done) {
resolve(Promise.resolve(value))
} else {
value.then(onFulled)
}
}
})
}
测试
function sleep(time) {
return new Promise((resolve, reject) => setTimeout(_ => resolve(time), time))
}
co(function* () {
console.log('start')
const b = yield sleep(1000)
console.log(b)
const a = yield sleep(2000)
console.log(a)
return 'end'
}).then(res => console.log(res))
网友评论