Я пытаюсь написать наш httpService, он должен иметь метод post, который проверяет, существует ли файл cookie с токеном auth, если он это делает, тогда он должен добавить заголовок auth и сделайте почтовый запрос.Угловой 2 как сделать вложенный наблюдаемый
Однако, если файл cookie не существует, мне нужно загрузить локальный файл json, содержащий токен, и использовать его для создания файла cookie, затем добавить заголовок auth и выполнить запрос на отправку.
Проблема, с которой я сталкиваюсь, заключается в том, что если файл cookie не существует, мне нужно сделать наблюдаемое ожидание другого наблюдаемого. Я думал, что решение заключается в использовании switchMap, но это плохо работает с .subscribe, который необходим для запроса http.post для инициализации.
private makePostRequest(address: string, payload: any, callback: any): Observable<any> {
return this.http.post(address, payload, { headers: this.headers })
.map(callback)
.catch((error: any) => this.handleError(error));
}
public post(address: string, payload: any, callback: any): Observable<any> {
if (this.hasOAuth2()) {
this.appendHeader(this.cookieService.get('oauth2'));
return this.makePostRequest(address, payload, callback);
} else if (this.isLocalhost()) {
return this.setAuthCookie()
.switchMap(() => this.makePostRequest(address, payload, callback));
} else {
return this.handleError('Could not locate oauth2 cookie');
}
}
private setAuthCookie(): Observable<any> {
return this.http.get('./json/token.json')
.map((res: Response) => {
let oauth2: any = res.json();
this.cookieService.set('oauth2', oauth2.access_token, oauth2.expiration);
this.appendHeader(oauth2.access_token);
})
.catch((error: any) => {
console.log('No dev token was found', error);
return Observable.throw(error);
});
}
Обновление: где это странно, это то, что более или менее точный код игры работает правильно с запросом на получение.
private makeGetRequest(address: string, callback: any): Observable<any> {
return this.http.get(address, { headers: this.headers })
.map(callback)
.catch((error: any) => this.handleError(error));
}
public get(address: string, callback: any): Observable<any> {
if (this.hasOAuth2()) {
this.appendHeader(this.cookieService.get('oauth2'));
return this.makeGetRequest(address, callback);
} else if (this.isLocalhost()) {
return this.setAuthCookie()
.switchMap(() => this.makeGetRequest(address, callback));
} else {
return this.handleError('Could not locate oauth2 cookie');
}
}
Решение: Я не был подписавшись на httpService.post наблюдаемым так было не всегда быть инициализирован.