async实现原理

128 阅读1分钟

async 函数是什么?一句话,它就是 Generator 函数的语法糖。

使用async实现串行请求
//需求发送3个请求,请求一完成后发送请求二,请求二完成后,发送请求三
function query(interval){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(interval)
        },interval)
    })
}
async function initQuery(){
    let result = await query(1000)
    console.log('请求一发送成功',result)
    result = await query(2000)
    console.log('请求二发送成功',result)
    result = await query(3000)
    console.log('请求三发送成功',result)
}
initQuery()
使用promise和generator实现
function* initQuery2(){
    let result = yield query(1000)
    console.log('请求一发送成功',result)
    result = yield query(2000)
    console.log('请求二发送成功',result)
    result = yield query(3000)
    console.log('请求三发送成功',result)
}
let itor = initQuery2()
itor.next(1000).value.then(res=>{
    //请求一执行成功
    itor.next(res).value.then(res=>{
    //请求二执行成功
        itor.next(res).value.then(res=>{
        //请求三执行成功
            console.log(itor.next(res))
        })
    })
})
//上面写法次数固定,不利于扩展,优化后代码如下
function execQuery(generator){
    let itor = generator()
    let next = (x) =>{
        let {value,done} = itor.next(x)
        if(done){
            return
        }
        value.then(result=>{
            next(result)
        })
    }
    next()
}
execQuery(initQuery2)