VueRouter 等待 ajax 完成

VueRouter wait for ajax is done

我正在构建 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();
        })
}

是异步请求。

你没有多少选择。 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() 修改为基于承诺。

然后您的 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'})
   }
});
   }


}

我没有带编辑器,所以它可能会出现一些小问题,但通常应该可以使用。希望对您有所帮助!

假设 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)
  }
}