Как мне смешать обещание с наблюдаемым? - PullRequest
1 голос
/ 04 октября 2019

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

if (!token || token.exp < Math.round((new Date()).getTime() / 1000)) {
  from(this._store.refreshBearerToken())
    .pipe(flatMap(resp => {
       let newToken = resp.data;
       newToken.exp = (new Date()).getTime() / 1000 + newToken.expires_in;
       localStorage.setItem('token', JSON.stringify(newToken))

       options = options || {};
       options.headers = new HttpHeaders({
         "Authorization": `${newToken.token_type} ${newToken.access_token}`,
         "Content-Type": "application/json"
        });
       return this._http$.request<T>(method, url, options as Object).pipe(share());
     }));
}

Метод токена носителя:

async refreshBearerToken() {
    const response = await this._q2.sources.requestExtensionData({
        route: "refreshBearerToken"
    });
    console.log(response);
    return response;
}

Поскольку this._store.refreshBearerToken возвращает обещание, я завернул вызов в from, чтобы преобразовать его в наблюдаемое. Это компилируется, но когда он запускается, я получаю "Не могу прочитать свойство 'pipe' из undefined".

Как я могу преобразовать это обещание в наблюдаемое, чтобы я мог обновить токен и затем продолжить с остальным вызовом?

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

Я импортирую from через import { Observable, from } from "rxjs";.

Итак, я думал, что ошибка исходит от линии .pipe(flatMap(resp =>..., но я ошибся. Ошибка исходит от метода, который вызывает это.

GetInitialLinkList(): Observable<Institution[]>
{
    let base = { 'MemberId': localStorage.getItem('memberId') };
    let ins = localStorage.getItem("initialInstitutionList");
    if (ins)
    {
        return of(JSON.parse(ins));
    }
    return this._settingsService.get().pipe(
        flatMap(settings =>
        {
            this._settings = settings;
            return this._api.request<Institution[]>("Post", `${this._settings.mea}/GetInitialLinkList`, { body: base })
                .pipe(
                    retry(1),
                    catchError(this.handleError)
                )
                .pipe(flatMap(instList =>
                {
                    localStorage.setItem("initialInstitutionList", JSON.stringify(instList));
                    return of(instList);
                }))
        }));
}

и на который подписан внутри моего компонента:

private GetLinkList()
{
    this.showWaiting.emit(true);
    this._data.GetInitialLinkList().subscribe((result) =>
    {
        this.initialList = result;
        this.showWaiting.emit(false);
    });
}

Из того, что сказал Брэндон (я забыл вернуться /facepalm ...) Я добавил возврат, поэтому у меня есть return from(this._store.refreshBearerToken()), который изменил мою ошибку на

ERROR Error Code: undefined
Message: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
defaultErrorLogger @ core.js:6014

1 Ответ

1 голос
/ 04 октября 2019

Можете ли вы показать фактическую ошибку и строку в коде, на котором происходит ошибка? Также покажите, куда и как вы импортируете from.

. Я заметил, что ваш фрагмент кода не возвращает наблюдаемое, которое он создает через from(...).pipe(...), и не подписывается на него. Это может помочь показать, как ваш код на самом деле использует это наблюдаемое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...