将一个观察者包裹在另一个中

时间:2016-05-06 07:38:58

标签: typescript angular rxjs

我为angular 2 http服务创建了一个包装器,它有一个post方法,如下所示。它返回一个可观察的。

post(url:string, data:any, headers:any, animation:boolean):any{

    let thisObject = this;

    if(animation!=false) {
        thisObject.emitCallStateChange(true);
    }

    return this._http.post(url,data,headers).finally(function(){
        thisObject.emitCallStateChange(false);
    });

}

我这样消费它:

return this._http_service.post(ConfigService.BASE_URL+'api/auth/forgotpass',email,{
        headers:headers
    },true);

我想要做的是为csrf验证请求执行GET并在post方法中返回此observable之前附加csrf标记。所以,我试图将一个observable包含在另一个中,如下所示:

this._http.get("api/getCsrf").subscribe(csrf=>{

        let body = csrf.json();

        data += "&_csrf="+body._csrf;

        console.log(data);

        return this._http.post(url, data, headers).finally(function () {
            thisObject.emitCallStateChange(false);
        });

    });

但它不能用于显然需要返回observable的原因。一旦csrf请求完成,我需要一种方法来返回带有post请求的最终observable。有没有办法可以链接观察者,只返回其中一个?

1 个答案:

答案 0 :(得分:2)

您可以利用flatMap运算符:

this._http.get("api/getCsrf").flatMap(csrf=>{
  let body = csrf.json();
  data += "&_csrf="+body._csrf;

  console.log(data);

  return this._http.post(url, data, headers).finally(() => {
    thisObject.emitCallStateChange(false);
  });
});

});