Возврат на полную асинхронность с RxJs - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь вернуть значение (строку) из функции, которая вызывает API, используя rxjs. Переменная должна быть возвращена в полном предложении наблюдаемой.

Это код:

getToken(): any {
    let token = '';

    this.meService.getMe().subscribe(data => {},
      err => {
        let headers = new HttpHeaders();
        headers = headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8').set(InterceptorSkipHeader, '');
        this.http.post(Configs.heroku + 'https://login.microsoftonline.com/common/oauth2/v2.0/token', 'grant_type=authorization_code&code=' + localStorage.getItem('refresh') + '&client_id=' + Configs.appId + '&redirect_uri=http://localhost:4200/redirect&' + 'client_secret=lkcqTNT730}zyoVLOX45)|;', {headers: headers}).subscribe(data => {
          localStorage.setItem('access', data['access_token']);
          token = localStorage.getItem('access');
        });
      },
      () => {
        return localStorage.getItem('access');
      });
  }

Как вы можете видеть: я пытаюсь вернуть переменную в полном предложении. Тем не менее, он никогда не возвращает переменную. Когда я распечатываю его в вызывающей функции, он просто говорит неопределенный. Какие-нибудь решения?

Заранее спасибо!

редактирование:

Это та часть, где вызывается функция:

console.log(auth.getToken());
    req = req.clone({
      setHeaders: {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + auth.getToken()
      }
    });

1 Ответ

0 голосов
/ 02 мая 2018

Я постараюсь объяснить вам, что происходит.

  1. Ваша функция getToken ничего не возвращает. Таким образом, вы получаете неопределенный при распечатке.
  2. Когда вы подписываетесь на наблюдаемое, у вас есть 3 возможных аргумента:
    • следующий: он выполняется каждый раз, когда вы получаете «галочку» в вашей наблюдаемой.
    • ошибка: выполняется при получении ошибки.
    • complete: выполняется после завершения наблюдения.

В любом из этих случаев вы передаете обратный вызов, который должен быть выполнен, когда происходит каждое из этих событий. Поскольку вы возвращаете внутри этих обратных вызовов, вы не возвращаете метод getToken, а функцию, которая вызывается внутри метода подписки. Представьте себе возможную реализацию метода подписки:

subscribe(nextCB, errorCB, completeCB){
    ...
    if(completed) {
        completeCB();
    }
}

Как видите, значение, которое вы возвращаете для полного обратного вызова, не присваивается и не возвращается. У вас есть несколько решений / альтернатив для вашего случая. Вы можете вернуть саму наблюдаемую информацию (this.meService.getMe ()) с некоторыми картами, а затем подписать ее где угодно, или просто запустить свой код внутри полного обратного вызова. Но IMO лучше потратить некоторое время на поиск общих понятий javascript и асинхронных концепций.

...