Возврат к полной асинхронности с RxJs

Я пытаюсь вернуть значение (строку) из функции, которая вызывает 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');
      });
  }

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

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

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

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

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

Вернуть на что именно? Ваш внешний метод ничего не возвращает.

jonrsharpe 02.05.2018 12:22

Да ладно, я хочу вернуться из моей "полной статьи". Как видите, там есть возврат.

abstract christmas tree 02.05.2018 12:29

Да, я это понимаю, но неясно, чего вы ожидаете. Вернуть к чему?

jonrsharpe 02.05.2018 12:30

Я отредактировал свой вопрос. Я ожидаю, что auth.getToken () вернет значение, указанное в операторе return.

abstract christmas tree 02.05.2018 12:37

Вы не поняли, как работает async (RxJs / Promise) JavaScript-программирование.

Thirueswaran Rajagopalan 02.05.2018 12:42

Прежде всего обратите внимание, что он не может возвращаться синхронно. Вам нужно вернуть наблюдаемое. Во-вторых, обратите внимание, что вы не должны подписываться в методе, если планируете возвращать наблюдаемое.

jonrsharpe 02.05.2018 12:42

Если я верну наблюдаемый. Это означает, что я должен копировать тело в (err -> {// body}) для каждого вызова, верно? Я не хочу этого делать ...

abstract christmas tree 02.05.2018 12:44

См., Например, stackoverflow.com/questions/36342784/…. Обратите внимание, что вы можете использовать, например, .catch для централизации обработки ошибок.

jonrsharpe 02.05.2018 12:52

Извините, но я новичок в Angular. Я действительно не вижу в этом вопросе более широкой картины. У меня в подписке 2 звонка.

abstract christmas tree 02.05.2018 13:11
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
9
36
1

Ответы 1

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

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

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

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

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

Другие вопросы по теме