在我的代码中,我有自定义的post方法,它扩展了angular 2的http类。
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);
}
}
在上面的代码post方法中返回一个Observable,而方法 this._gs.getToken()在if条件从本地存储中读取令牌的异步调用并返回一个promise。
虽然编译doenst会产生任何错误,但是当我访问时
this.http.post(&#39; / api / myFormHandler&#39;,this.form.value) .subscribe((data)=&gt; { });
class MyFormComponent- inline template:16:29 caused by: Cannot read property 'subscribe' of undefined
答案 0 :(得分:1)
由于JS的异步特性,你的第一个条件并没有真正返回正确的东西。为了能够从abhishek-api
方法返回Observable<any>
,您应该修改第一个post
的正文以使用两个相互依赖的可观察对象。
if
首先,你必须将你的令牌返回方法转换为一个observable然后// 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);
,因为我们需要在第二个observable中得到这个结果。
请参阅此文章 - combining observables。