async、await是es6新出的,主要是为了解决多个promise函数产生的嵌套层级过多的问题。
async、await是基于generator实现的代码中断操作(上一个await未处理完时,代码不会继续向下执行,看上去就是中断了代码)
generator和普通function函数区别在于function之后有个*来告诉js这是generator函数,然后代码内部由yield把代码分割成若干个片段。通过generator执行后的返回值.next()去一个一个按顺序执行。
:next函数也是可以接受参数的,它的参数就是yield函数的返回值。
f.next()返回值是当前执行的yield后面代码的值,不要return,自动返回。
先用setTimeout实现一个异步函数:awaitFn
function awaitFn(backData){
return function(callBack){
setTimeout(()=>{callBack(++backData)},1000)
}
}
再用Generator实现一个asyncFn函数,模拟async await代码结构:
function* asyncFn(){
let res=yield awaitFn(0);
console.log(res,'第一次')
res=yield awaitFn(res);
console.log(res,'第二次')
res=yield awaitFn(res);
console.log(res,'第三次')
res=yield awaitFn(res);
console.log(res,'第四次')
}
最关键的一步,通过generator函数的特性,写一个递归函数来实现async await
function init(fn){
const f=fn();
function next(data){
const res=f.next(data);
if(res.done) return res.value;
res.value((backData)=>{
next(backData);
})
}
next();
}
init(asyncFn)