VueRouter等待ajax完成

时间:2017-01-05 16:17:22

标签: javascript vue.js vuejs2 vue-router vue-resource

我正在构建SPA,问题是检查用户是否是管理员。

Vue.auth.getUserInfo()之后,我想要停止整个应用程序并等待API响应,Vue.auth.user.isAdmin总是假的,因为我没有来自api的响应......

这是router.beforeEach

router.beforeEach((to, from, next) => {

   if(Vue.auth.user.authenticated == false) {
       Vue.auth.getUserInfo();
   }

   if(Vue.auth.user.isAdmin) {
      next({ name: 'admin.index' })
   } else {
      next({name: 'client.index'})
   }
}

获取用户信息方法:

getUserInfo() {
    Vue.http.get('/api/me')
        .then(({data}) => {
            this.user = data;
        }, () => {
            this.logout();
        })
}

2 个答案:

答案 0 :(得分:1)

这是异步请求。

你几乎没有选择。 1.将此功能移至vue-router并放置代码:

   if(Vue.auth.user.authenticated == false) {
       Vue.auth.getUserInfo();
   }

   if(Vue.auth.user.isAdmin) {
      next({ name: 'admin.index' })
   } else {
      next({name: 'client.index'})
   }
}

在您的请求的then()函数中。

  1. 可能更适合您的学习曲线 - 修改您的getUserInfo()承诺。
  2. 然后,您将在auth模块中找到类似的内容:

    var getUserInfo = new Promise((resolve,reject) => {
     Vue.http.get('/api/me')
            .then(({data}) => {
                this.user = data;
                resolve();
            }, () => {
                this.logout()
                reject();
            })
    }
    

    并在您的路由器中:

    router.beforeEach((to, from, next) => {
    
       if(Vue.auth.user.authenticated == false) {
           Vue.auth.getUserInfo().then(()=>{
    if(Vue.auth.user.isAdmin) {
          next({ name: 'admin.index' })
       } else {
          next({name: 'client.index'})
       }
    });
       }
    
    
    }
    

    我没有编辑跟我一起,所以它可能有一些小问题但通常应该有效。希望它有所帮助!

答案 1 :(得分:1)

假设在Vue.auth.user.isAdmin逻辑中管理Vue.auth.getUserInfo()的状态,您可以尝试一种承诺方法(未经测试):

getUserInfo() {
  return new Promise((resolve, reject) => {
    Vue.http.get('/api/me')
      .then(({data}) => {
        this.user = data;
        // Or, to use when consuming this within the then() method:
        resolve(data);
      }, () => {
        reject();
      })
  })
}

然后,当你在守卫中使用它时(https://router.vuejs.org/en/advanced/navigation-guards.html):

// A couple small auth/guard helper functions
function guardCheck(next) {
  if(Vue.auth.user.isAdmin) {
    next({ name: 'admin.index' })
  } else {
    next({name: 'client.index'})
  }
}
function guardLogout(next) {
  Vue.auth.user.logout()
    .then(() => {
      next({ name: 'home.index', params: { logout: success }})
    })
}

router.beforeEach((to, from, next) => {
  if(Vue.auth.user.authenticated === false && !to.matched.some(record => record.meta.isGuest)) {
    Vue.auth.getUserInfo()
      .then((user) => {
        guardCheck(next)
      })
      .catch(() => {
        // Not sure how your logout logic works but maybe...
        guardLogout(next)
      })
  } else {
     guardCheck(next)
  }
}