2017-06-25 73 views
0

我有以下方法:角2个rxjs FlatMap错误

request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
    this.customOptions = options; 
    return this.authService.approveTokenExpiration() 
     .flatMap((res) => { 
     if (!(res.json().data.error) && !(res.error)) { 
      console.log("addedHeaders"); 
      this.addAuthHeader(); 
      console.log(this.customOptions); 
     } else { 
      // return this.authService.refreshToken() 
      // .flatMap(() => { 
      //  this.addAuthHeader(); 
      //  return super.request(url, this.customOptions); 
      // }); 
     } 
     }) 
     .flatMap(res => { 
     return super.request(url, this.customOptions); 
     }); 
    } 

和approveTokenExpiration方法:

public approveTokenExpiration(): Observable<any> { 
    let header = new Headers(); 
    header.append('Authorization', this.formTokenHeaderValue()); 
    console.log(header); 
    let options = new RequestOptions({headers: header}); 
    return this.http.get(Constants.SERVER_URL, options) 
     .map(res => { 
     return res; 
     }) 
     .catch(err => { 
     return err; 
     }); 
    } 

我得到这样的错误,当我试图链我rxjs请求:

ERROR in [at-loader] ./src/app/auth/intercept/auth.interceptor.ts:18:16 TS2345:类型'(res:any)=> void'的参数不是assig nable参数的类型'(值:任何,索引:数量)=> ObservableInput < {}>'。 类型'void'不可分配为键入'ObservableInput < {}>'。

如何正确链接此请求? FlatMap是否链接.map()和.error()方法?我可以用这种方式链接请求吗?因为我需要从我的请求方法(它的自定义Http实现)返回Observable以让用户在此订阅。

回答

2
.flatMap((res) => { 
    if (!(res.json().data.error) && !(res.error)) { 
     console.log("addedHeaders"); 
     this.addAuthHeader(); 
     console.log(this.customOptions); 
    } 

您的if语句没有返回可观察值。你应该在这里返回一些观察值。

+0

或者如果您需要对流进行一些计算,则使用.map运算符。如果预计会产生副作用(如在流本身之外添加头),则可以使用do操作符 – LookForAngular