У меня проблемы с обещаниями и наблюдениями. У меня есть несколько запросов 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