我在角度保护中的异步函数中处理异步函数时遇到问题,下面的保护首先返回未定义的isLogged值,然后返回真正的isLogged值,然后返回我想要的值。有人可以帮我解决这个简单的问题吗?
export class AuthGuardService implements CanActivate {
constructor(
private router: Router
) { }
canActivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.checkIfUserIsLogged()) {
return true;
}
this.router.navigateByUrl('/login');
return false;
}
private checkIfUserIsLogged(): boolean {
if (!window.indexedDB) {
console.log(`Your browser doesn't support a stable version of IndexedDB.`);
}
let isLogged;
const request = indexedDB.open(DB.NAME);
request.onsuccess = () => {
const userName = localStorage.getItem('user');
const db = request.result;
const tx = db.transaction(DB.OBJECT_STORE, 'readwrite');
const store = tx.objectStore(DB.OBJECT_STORE);
const logoutRequest = store.get(userName);
logoutRequest.onsuccess = () => {
console.log(logoutRequest.result.isLogged);
logoutRequest.result.isLogged ? isLogged = true : isLogged = false;
};
return isLogged;
};
console.log(isLogged);
return isLogged;
}
}
当使用异步方法时,必须小心,因为在函数处于处理状态时会立即返回值,而不是立即返回,因此编译会消失,直到该值处于处理状态为止。我认为您的问题在这里:
private checkIfUserIsLogged(): boolean {
if (!window.indexedDB) {
console.log(`Your browser doesn't support a stable version of IndexedDB.`);
}
let isLogged=false; // start with false
const request = indexedDB.open(DB.NAME);
request.onsuccess = () => {
const userName = localStorage.getItem('user');
const db = request.result;
const tx = db.transaction(DB.OBJECT_STORE, 'readwrite');
const store = tx.objectStore(DB.OBJECT_STORE);
const logoutRequest = store.get(userName);
logoutRequest.onsuccess = () => {
console.log(logoutRequest.result.isLogged);
logoutRequest.result.isLogged ? isLogged = true : isLogged = false;
return logoutRequest.result.isLogged; //you need to return now the value whe the on success is processed
};
};
}