关于 async await 理解,以及await的错误处理

129 阅读1分钟

没有什么比从代码理解更深刻了

    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得到返回的结果。