Почему это if никогда не выполняется

#javascript #angular

#javascript #angular

Вопрос:

Чего я пытаюсь достичь, так это:
— сначала выполняется обратный вызов и
this.auth.javaAuthToken , который является свойством в другом файле, инициализируется значением токена.
— после этого вызывается эта функция: return this.auth.getUserFiles();

Если я сделаю это:

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
   let token = null;
    this.auth.emailListCleaningUserDetail().subscribe((res: any)=>{
    token = res.body.data.access_token;
    token = this.auth.javaAuthToken;
     return this.auth.getUserFiles();
  });
  

Затем я получаю сообщение об ошибке:

функция должна возвращать значение

Итак, я написал приведенный ниже код, чтобы проверить, существует ли токен. Если да, то я вызываю функцию и возвращаю.

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
   let token = null;
    this.auth.UserDetail().subscribe((res: any)=>{
    token = res.body.data.access_token;
    token = this.auth.javaAuthToken;
    console.log(token);
    console.log('inside fun');  
  });
    if(token) {
      console.log('inside if outside fun');
      this.auth.javaAuthToken = token;
      return this.auth.getUserFiles();
    }
    console.log('outside if and fun')
  }
}  
  

Когда я запускаю программу,
— Сначала outside if and fun печатается,
— затем печатается токен, и
— затем inside fun печатается.

Комментарии:

1. привет, если ответ помог, пожалуйста, отметьте ответ 😉

Ответ №1:

Это довольно просто, когда вы пытаетесь получить доступ к токену (когда вы возвращаете свой результат), результат еще недоступен. В асинхронных функциях вам нужно либо дождаться значения, либо подписаться на событие.

Если вы подписываетесь на событие, вы можете получить доступ только к значению внутри подписки.

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
   let token = null;
    this.auth.UserDetail().subscribe((res: any)=>{
    token = res.body.data.access_token;
    token = this.auth.javaAuthToken;
    console.log(token);
    console.log('inside fun');  
    
    // This is called when you receive your result which can be later as the code below as this is async

  });

// token is always null because its declared as null before
// when this code runs, there is no result of your Service yet
    if(token) {
      console.log('inside if outside fun');
      this.auth.javaAuthToken = token;
      return this.auth.getUserFiles();
    }
    console.log('this runs right after the code before but the result is not available yet')
  }
}  

мне интересно, тоже ли это асинхронно:

 this.auth.getUserFiles();
  

Затем вы могли бы сделать что-то вроде этого

 LoadUserData = async event => {

    var token = null;
    var userfiles = null;
    try {
        var response = await this.auth.UserDetail()
        if (response.data != null) {
            token = response.data.access_token;        
            console.log('Receiving result: ' JSON.stringify(response.data));
        }
    } catch (error) {
        console.log('ERROR: ' error)
    }

    try {
          var responseUserFiles = await this.auth.getUserFiles();
          if (responseUserFiles.data != null) {
              // do something with your userfiles
              userfiles = responseUserFiles.data;
              console.log('Receiving result: ' JSON.stringify(responseUserFiles.data));
          }
      } catch (error) {
          console.log('ERROR: ' error)
    }

    // Here you can return what you want, userfiles  or token
    return userfiles;
}  

Ответ №2:

попробуйте это

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
   let token = null;
    this.auth.UserDetail().subscribe((res: any)=>{
    token = res.body.data.access_token;
    token = this.auth.javaAuthToken;
    console.log(token);
    console.log('inside fun');  

    if(token) {
      console.log('inside if outside fun');
      this.auth.javaAuthToken = token;
      return this.auth.getUserFiles();
    }

 });
    console.log('outside if and fun')
  }
}
  

Комментарии:

1. return this.auth.getUserFiles(); должно быть возвращено вне обратного вызова, иначе это выдает ошибку, которую функция должна вернуть…