在方法中使用Promise返回Observable导致错误

时间:2016-11-21 19:05:23

标签: angular ionic2 observable angular-promise es6-promise

在我的代码中,我有自定义的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

1 个答案:

答案 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