async await手写实现

用es6新语法 generator实现

function promiseFunc(step) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(step + 1)
        }, 3000)
    })
}

function promiseFuncReject(step) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(step + 1)
        }, 3000)
    })
}

function normalFunc(step) {
    return step + 1
}

function* gen() {
    let step = yield promiseFunc(0)
    console.log(step)
    step = yield promiseFunc(step)
    console.log(step)
    step = yield promiseFuncReject(step)
    console.log(step)
    step = yield normalFunc(step)
    console.log(step)

    return step
}

function genToAsync(genFunc) {
    const gen = genFunc()

    return new Promise((resolve, reject) => {
        function next(val) {
            let res
            // 使用try catch捕获可能出现的错误,返回reject状态的promise
            try {
                res = gen.next(val)
            } catch (error) {
                return reject(error)
            }

            const { value, done } = res
            if (done) {
                // 如果done为true, 说明走完了,直接resolve
                return resolve(value)
            } else {
                //如果done为false, 代表未走完, 继续
                // value可能是promise、值、非promise函数。。。
                return Promise.resolve(value).then(val => next(val)).catch(err => reject(err))
            }
        }

        next()
    })

}

genToAsync(gen)
    .then(res => {
        console.log(res)
    })
    .catch(err => {
        console.log(err)
    })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容