【问题标题】:Wrapping an observable within another将一个可观察对象包装在另一个对象中
【发布时间】:2016-05-06 15:43:30
【问题描述】:

我已经为 angular 2 http 服务创建了一个包装器,它有一个如下的 post 方法。它返回一个 observable。

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 并附加 csrf 令牌,然后在 post 方法中返回此 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。有没有一种方法可以链接可观察对象并只返回其中一个?

【问题讨论】:

    标签: typescript angular rxjs


    【解决方案1】:

    您可以为此利用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);
      });
    });
    
    });
    

    【讨论】:

    • 我只是想把你的答案链接到这个:) stackoverflow.com/questions/36712659/…
    • 谢谢!是的,这绝对是相关的 ;-)
    • @ThierryTemplier 我已经在使用 rxjs npm 包了。我必须单独添加响应式扩展吗?因为,这个操作符不是 rxjs 的一部分
    • 不,没关系!您需要导入运算符:全局或一个一个。看到这个问题:stackoverflow.com/questions/34515173/….
    • 哦。谢谢。他们或许应该在某处提及它。也许我错过了:D
    猜你喜欢
    • 2016-09-12
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多