Angular2订阅了两次

时间:2017-03-20 16:26:36

标签: angular subscribe

我创建了一个http客户端,我在其中删除了http post方法:

post(url, data):Observable<Response> {
    let headers = new Headers();
    this.createAuthorizationHeader(headers);
    var response = this.http.post("\\services" + url, data, {
        headers: headers
    });

    return this.handleResponse(response);
}

private handleResponse(responseO : Observable<Response>) : Observable<Response> {
    responseO.do(response =>
    {
        if (response.url.includes("LoginPage.html")) {
            window.location.replace("../LoginPage.html");
        }
    });

    return responseO;
}

然后在我的服务中我订阅:

return this.http.post("/dummy", params).subscribe(response => callback(response.json()));

在我的httpClient中如果我返回响应而不是handleResponse(响应),一切正常。我需要的是除了当前的行为之外我还要求在responseO.do(..)中进行检查。

我也尝试过response.share();并订阅此对象,但这也不起作用。

有没有办法实现我正在寻找的东西?感谢。

2 个答案:

答案 0 :(得分:1)

当然你没有使用do拦截器订阅Observable。 使用do拦截器返回Observable:

post(url, data):Observable<Response> {
    let headers = new Headers();
    this.createAuthorizationHeader(headers);
    var response = this.http.post("\\services" + url, data, {
        headers: headers
    });

    return this.handleResponse(response);
}

private handleResponse(responseO : Observable<Response>) {
    return responseO.do(response => {
        if (response.url.includes("LoginPage.html")) {
            window.location.replace("../LoginPage.html");
        }
    });
}

答案 1 :(得分:1)

如果您想操纵observable的流数据,而不是使用do,则应该使用map。这是操纵流的“反应性”方式。

post(url, data):Observable<Response> {
    let headers = new Headers();
    this.createAuthorizationHeader(headers);
    var response = this.http.post("\\services" + url, data, {
        headers: headers
    });

    return response.map(res => handleResponse(res));
}

private handleResponse(responseO : Response) : Response {
    if (response.url.includes("LoginPage.html")) {
        window.location.replace("../LoginPage.html");
    }

    return responseO;
}

我还建议不要在Angular 2应用中使用window.location.replace,因为它会强制页面刷新,这意味着必须重新启动应用程序。如果您使用Angular路由器更改路线,则在导航时无需等待应用加载。