首页 文章

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

提问于
浏览
0

在我的代码中,我有自定义的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,而if条件 this._gs.getToken() in if条件从本地存储中读取令牌的异步调用并返回一个promise .

虽然编译doenst会产生任何错误,但是当我访问时

this.http.post('/ api / myFormHandler',this.form.value).subscribe((data)=> {});

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

1 回答

  • 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);
    

    首先,你必须将你的令牌返回方法转换为observable然后 flatMap 它,因为我们需要在第二个observable中得到这个结果 .

    请参阅这篇文章 - combining observables .

相关问题