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()
函数中。
- 可能更适合您的学习曲线 - 将您的
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)
}
}
我正在构建 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()
函数中。
- 可能更适合您的学习曲线 - 将您的
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)
}
}