代码之家  ›  专栏  ›  技术社区  ›  Naveed Ahmed

在返回可观察原因错误的方法中使用Promise

  •  0
  • Naveed Ahmed  · 技术社区  · 8 年前

    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方法返回一个可观察值,而 这个._gs.getToken() 在if条件中,从本地存储读取令牌是一个异步调用,并返回一个promise。

    this.http。post(“/api/myFormHandler”,this.form.value) });

    class MyFormComponent- inline template:16:29 caused by: Cannot read property 'subscribe' of undefined
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Daniel Mylian    8 年前

    由于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);
    

    首先,您必须将令牌返回方法强制转换为observable,然后 flatMap 我们需要第二个可观察的结果。

    请参阅本文- combining observables .