利用promise解决vue异步请求问题

用VUE做项目首页功能,设想的步骤是页面异步请求加载菜单,由于刚加载的时候路径是“/”,所以没有对应的路由显示页面,这样就会导致用户体验很差,所以就判定在路径为‘/’的时候,默认匹配到菜单的第一个子节点。代码如下

loadMenu: function (user) {
        let me = this;
        me.$store.commit('setUser', user);
        me.$http.get('./svc/role/menu').then(function (res) {
          me.menus = res.data;
        }).catch(err => {
            console.log("菜单加载失败");
          }
        );
        let path = me.$route.fullPath;
          if (path == '/') {
            me.$router.push(me.menus[0].children[0].url);
          }
      }

这时候刷新页面发现还是不可以,于是就在控制台打印meaus的值,发现是undifined。这个时候我就想到了异步加载的机制是发生在页面加载后的,所以这个时候是获取不到数据的。自然而然的就想到了要用同步,当时百度了一下发现axios并不能像ajax那样加一个asyn的字段就可以实现同步,那么只能通过promise回调的方式等异步加载完成后,确认成功再执行后面的操作。更新后的代码如下:

     loadTree:function(){
        return new Promise(((resolve, reject) => {
          this.$http.get('./svc/role/menu').then((res)=>{
            resolve(res.data)
          }).catch(function (error) {
            reject(error)
          })
        }))
      },
      loadMenu: function (user) {
        let me = this;
        me.$store.commit('setUser', user);
        me.loadTree().then(res=>{
          me.menus = res;
          console.log(res);
          let path = me.$route.fullPath;
          if (path == '/') {
            me.$router.push(me.menus[0].children[0].url);
          }
        },error=>{
          console.log(error);
        })
      }

这里定义了一个函数,返回的是Promise函数,在loadMenu方法中调用该函数,利用promise的then属性返回请求成功的值,再把值赋给meaus。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值