没有什么比从代码理解更深刻了
function run(gen) {
// gen 是一个 generator 函数
const iterator = gen()
return new Promise(success => {
const step = res => {
const result = iterator.next(res)
const { value, done } = result
if(done) {
if (value instanceof Promise) {
value.then(val => success(val))
} else {
success(value)
}
} else {
if (value instanceof Promise) {
value.then(val => step(val))
} else {
Promise.resolve(value).then(val => step(val))
}
}
}
step()
})
}
我再用文字描述一下 async await 的一些细节
- async 返回一个 成功 的 promise
- await 右侧的值不管是promise还是正常的值,都会被包装成promise(如上代码可以体现)
关于我在工作中对 await 的错误处理
const wrapperAwait = p =>
p
.then(res => ({ res, err: null }))
.catch(err => ({ err, res: null }))
await 其实会把右侧的值调用 then 返回函数执行的结果,但是一般出现错误的时候可能走了reject,所以导致不存在then方法,这样代码很可能就停在那里了,如上的wrapperAwait将promise包裹一次then catch,这样就可以继续then得到返回的结果。