2016-11-21 25 views
0

在我的代码使用无极我有自定义后方法,其盘区的http类的角2.在方法返回可观察原因错误

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( '/ API/myFormHandler',this.form.value) .subscribe((数据)=> { });

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

顺便说一句,在使用胖箭头功能时,您不必使用'that = this'。 – hgoebl

+1

'if(!...){...}'不返回任何东西。 – hgoebl

回答

1

由于JS的异步性质,您的第一个条件并不实际返回正确的东西。为了能够从post方法中返回Observable<any>,您应该修改第一个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