2016-09-21 41 views
1

好吧,我一定有一些我不明白的关于map()函数。我期望在订阅的两种情况下,映射的术语被写入控制台。但是,如果http响应的状态码为4xx,则不是。关于http响应的RxJs/Angular2映射函数不叫

http.get("http://my.domain/rest/path").map(
    data => { 
    console.log("mapped"); 
    return data; 
    } 
).subscribe(
    data => { 
    console.log("good"); 
    }, 
    error => { 
    console.log("bad"); 
    } 
); 

这里有什么提示吗?

回答

3

map函数只进行“良好”的数据,而不是错误。在实际情况中,我期望Ok个案(真实数据)和Bad Request个案(错误讯息)的不同身体数据。为了赶在http.get功能处理错误,使用catch

let obs = http.get("http://my.domain/rest/path").map(
    data => { 
    console.log("mapped"); 
    return data; 
    } 
).catch(err => console.log(err)); 

obs.subscribe(...); 
+0

我明白了。然而,似乎只要发现异常,Observable就会取消订阅(根据我的调试器,请参阅RxJs的catch.js:58 beta11版本),随后的“订阅”会导致“TypeError:Can not read property”Symbol(Symbol。迭代器)“的未定义 ”其实我需要订阅并处理结果,即使在Http状态4xx/5xx的情况下。 – Matt

+1

PS:刚刚发现,当我从catch块中返回一个Observable.of(...)时,它会起作用。 – Matt

2

的角2 Http客户对待与4xx5xx状态码as errors响应。所以map运营商不会收到发出的回应。

注意的是,如果错误是由于抛向了响应的状态码,错误将包含statusstatusText属性:

http.get("http://my.domain/rest/path").map(
    data => { 
    console.log("mapped"); 
    return data; 
    } 
).subscribe(
    data => { 
    console.log("good"); 
    }, 
    error => { 
    if (error.status) { 
     console.log("somewhat bad: " + error.status); 
    } else { 
     console.log("really bad"); 
    } 
    } 
); 
+0

好的。如果不深入研究源代码,我可以认为http的'get''会在状态4xx/5xx上抛出一个异常,这个异常被''map'忽略,并且被''subscribe'在内部捕获,而这个异常又将第二个“错误”函数的异常有效载荷? – Matt

+1

这是正确的。如果你想处理组合observable中的错误,你可以包含一个'catch'运算符 - 正如另一个答案中提到的那样。 – cartant

+0

太好了。感谢您的解释。由于'catch'块是让我在这里领先的,所以我选择了Harry的答案作为解决方案,并且两者都选择+1。 – Matt