用Thunk避免回调地狱

184 阅读1分钟

实现一个异步函数

// const delayLog=(msg)=>
// setTimeout(()=>{console.log(msg)},1000)

修改为嵌套异步,希望在每秒以后执行函数(参数不同)

const delayLog=(msg,cb)=>
setTimeout(()=>{
  console.log(msg);
  cb&&cb();
  },1000);

最后我们希望我们输入的参数是类似这种格式

 // ['msg1','msg2','msg3','msg4','msg5'] 
 //每隔一秒来接连打印上面的参数(也就是执行异步函数,至于函数内部什么逻辑要看我们的业务)

采用科里化:保留前面的参数,后面的参数作为回调传入

  const saveFirst=(msg)=>(cb)=>delayLog(msg,cb);
  const text1=saveFirst('msg1')
  const text2=saveFirst('msg2')
  const text3=saveFirst('msg3')
  
  // 后面的函数作为回调函数参数传给前面的函数 回调地狱写法
  // text1(()=>text2(()=>text3()))

传入参数数组,实现回调嵌套(Thunk写法)

const thunkMonk=(arr)=>
arr.reduceRight((a,b)=>()=>{
  b(()=>a())
})
  
thunkMonk([text1,text2,text3])();

运行效果

image.png