2016-10-27 4 views
0

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

ответ

0

Добавить пустой .subscribe() на ваш второй случай:

return this.setAuthCookie() 
      .map(() => { }) 
      .switchMap(() => { // I need to switchMap due to the http.get request in the setAuthCookie method 
      this.makePostRequest(address, payload, callback).subscribe(); // Again I need this or the post request won't be made 
      }).subscribe(); // <--- here 

Он активирует вызов HTTP.

0

Я никогда не подписывался на свой наблюдаемый httpService.post, поэтому он никогда не инициализировался. Добавление последующих вызовов подписки приводило к неправильной инициализации.

Смежные вопросы