初学async

开始接触async异步函数时,只是很生硬的记住了它是异步函数,当遇到异步操作的时候可以用,但是每每在遇到异步的时候又不知如何用,因为我一步步地写代码也是可以实现效果呢,干吗非得用新的不熟悉的异步函数呢?比如我遇到这样一个需求,左侧树拖拽移动改变父级。

由于改变父级这个方法,需要传好多拖动的文件的详细信息,还要再请求后台,所以这个需求需要发起两次请求,一次获取详细信息,拿到结果后再发起另一个请求改变父级,最后成功后再刷新tree就可以了。

开始我是这样写的(现在看好初级的写法啊😅方法里套方法):

onDrop = (info)=>{
      console.log('拖拽结束',info);
      const dropKey = info.node.props.eventKey;
      const dragKey = info.dragNode.props.eventKey;
      let data = {
        "id": dragKey
      }
      let url = 'http.......';
      //调接口获取拖动的文件夹的详细信息
      axios({
        method: 'post',
        url:url,
        headers:{'Content-type': 'application/json'},
        data:data
      }).then((res)=>{
        if(res.data.code===0){
        //这里获取到拖动的文件的详细信息,再作为参数调另一个接口改变父级
        let data2 = {
              "id": dragKey,
              "name": res.data.data.name,
              "pid": dropKey,
              "menuDesc": res.data.data.menuDesc
            }
        let url2 = 'http........';
         //得到结果后再调取另一个接口,改变父级
        axios({
              method: 'post',
              url:url2,
              headers:{'Content-type': 'application/json'},
              data:data2
              }).then((res)=>{
              if(res.data.code===0){
                //移动成功后刷新左侧tree即可
                this.refreshLeftTree();
              }else{
                message.error(res.data.message);
              }
            }); 
         })
        }else{
          message.error(res.data.message);
        }
      });         
    }

后来偶然看到一篇文章,我们为什么需要async/await ?
真的就豁然开朗了,感谢作者(🌹) 。
文章里说await是等候的意思,多简单的大白话,哈哈,那我外层的axios加上await不就可以了,直到promise执行并取到resolve才会继续往下执行。也就是说promise会临时阻塞代码继续往下执行,直到取到resolve里的值,那如果用了await就必须要有promise和resolve不然就没有任何意义了。

看到这里我就恍然大悟了,哈哈,那废话少说上代码:
这里的代码并不完善,进一步优化代码请参考再学async

//我们在这里声明了一个变量,接住promise里resolve的数据
let menuData = await axios({
        method: 'post',
        url:url,
        headers:{'Content-type': 'application/json'},
        data:data
      }).then((res)=>{
        if(res.data.code===0){
          return new Promise((reslove, reject) => {
              reslove(res.data.data);
         })
        }else{
          message.error(res.data.message);
        }
      });

后来的事就简单啦,在调取改变父级的接口,把menuData里的数据传进去就可以啦~

    let data2 = {
              "id": dragKey,
              "name": menuData.name,
              "pid": dropKey,
              "menuDesc": menuData.menuDesc
            }
      let url2 = 'http.......';
      axios({
              method: 'post',
              url:url2,
              headers:{'Content-type': 'application/json'},
              data:data2
            }).then((res)=>{
              if(res.data.code===0){
                this.refreshLeftTree();
              }else{
                message.error(res.data.message);
              }
        }); 

当然如果要用await必须要在函数名里加上async,像这样:

  onDrop = async (info)=>{...}

如果我们把两个axios分别都封装好两个方法,那最终结果看起来是这样的:

// 获取详情
getDetailData(dropKey, dragKey){
    axios({
      method:'post',
      ...
    }).then((res)=>{
        return  new Promise((reslove, reject) => { reslove(res) })
}
//改变父级
changeParent(data){
  axios({
      method:'post',
      ...
    }).then((res)=>{ this.refreshTree() }
} 
onDrop = async (info) {
    const dropKey = info.node.props.eventKey;
    const dragKey = info.dragNode.props.eventKey;
    const data = await this.getDetailData(dropKey, dragKey);
    this.changeParent(data);
}

小结
这就是所谓的,虽然异步但是代码看起来是同步的写法,顿时增加了易读性,易于维护有木有,反正本人在看到像axios这种获取结果后里面再调方法的代码,真的感觉头皮发麻,写完自己都懒得看了,哈哈哈。所以异步用起来,这也是进阶为中高级前端的必走之路,加油💪

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容