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)