2016-11-21 2 views
0

В моем коде у меня есть специальный метод поста, который экстенты класса HTTP угловой 2.Использования Promise в методе, возвращающий Observable Ошибки Причины

post(url: string, body: string, options?: RequestOptionsArgs): Observable<any> { 

     if (!this._gs.externalRequest) { 
      let that = this; 
      this._gs.getToken().then((token) => { 
       if (token) { 
        options = this.prepareOptions(options, token); 
       } 
       return that.sendPostRequest(url, body, options); 
      }); 
     } 
     else { 
      this._gs.externalRequest = false; 
      return this.sendPostRequest(url, body, options); 
     } 
    } 

В вышеуказанном способе кода поста возвращает Наблюдаемые в то время как метод это. _gs.getToken(), если условие читает токен из локального хранилища, его асинхронный вызов и возвращает обещание.

Хотя компиляция doenst генерировать какие-либо ошибки, но, когда я достигаю

this.http.post ('/ апи/myFormHandler', this.form.value) .subscribe ((данные) => { });

class MyFormComponent- inline template:16:29 caused by: Cannot read property 'subscribe' of undefined 
+0

Кстати, вам не нужно использовать 'this = this' при использовании функций стрелки жира. – hgoebl

+1

'if (! ...) {...}' ничего не возвращает. – hgoebl

ответ

1

Из-за асинхронного характера JS ваше первое условие фактически не возвращает правильную вещь. Чтобы иметь возможность вернуть Observable<any> из метода post, вы должны изменить тело вашего первого if для работы с двумя наблюдаемыми, которые зависят друг от друга.

// sample 
const getToken = Promise.resolve('token'); 
const resolveToken = Rx.Observable.fromPromise(getToken); 

... 
if (!this._gs.externalRequest) { 
    return resolveToken 
    .flatMap(token => { 
     if (token) { 
      options = this.prepareOptions(token); 
     } 
     return this.sendPostRequest(url, options); 
    }) 
} 
... 
this.post.subscribe(console.log); 

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

Пожалуйста, обратитесь к этой статье - combining observables.

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