Skip to content

async 和 await 实现原理

简单实现

js
function request(data) {
    return new Promise(resolve => {
        setTimeout(() => resolve(data + '-done'), 100)
    })
}


// ========== async/await 版本 ==========
async function runAsync() {
    const res = await request('11')
    const res2 = await request(res)
    console.log(res2)
}


// ========== Generator 模拟版本 ==========
function* generate() {
    const res = yield request('11')      // 第1次 yield,等待外部传入结果
    const res2 = yield request(res)       // 第2次 yield
    console.log(res2)
}

function runGenerator() {
    const g = generate()
    function exec(prevValue) {            // ← 接收上一次的结果
        const { value, done } = g.next(prevValue)  // ← 传回生成器内部
        if (!done) {
            // value 是 Promise,resolve 后继续执行
            value.then(res => exec(res))  // ← 递归执行,形成"伪同步"
        }
    }
    
    exec()  // 第一次启动,不传值
}

// 测试
runGenerator()

更完整的实现(类似 co 库)

js
function co(genFn) {
    return new Promise((resolve, reject) => {
        const g = genFn()
        
        function step(value) {
            let result
            try {
                result = g.next(value)
            } catch (e) {
                return reject(e)
            }
            
            if (result.done) {
                return resolve(result.value)
            }
            
            Promise.resolve(result.value).then(
                val => step(val),
                err => g.throw(err)  // 错误处理
            )
        }
        
        step()
    })
}

// 使用
co(function* () {
    const res = yield request('11')
    const res2 = yield request(res)
    return res2
}).then(console.log)