2016-09-21 48 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