如何处理瓜耳瓜耳胶中的异步功能?

问题描述 投票:0回答:1

我在角度保护中的异步函数中处理异步函数时遇到问题,下面的保护首先返回未定义的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;
  }
}
angular function asynchronous guard
1个回答
0
投票

当使用异步方法时,必须小心,因为在函数处于处理状态时会立即返回值,而不是立即返回,因此编译会消失,直到该值处于处理状态为止。我认为您的问题在这里:

         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
              };

          };
}
© www.soinside.com 2019 - 2024. All rights reserved.