2017-04-20 30 views
2

角度服務中的一種方法返回組件訂閱的Observable。但是在這種方法中,還有一個承諾也會被返回,並且我希望能夠抓住它,以防它返回一個拒絕。找到一塊下面的代碼:捕獲包含在observable中的promise錯誤 - angular 2

return this.http.get(url) 
      .map(res => res.json()) 
      .map((data: any) => { 
       try { 
        if (data === "14") { 
         this.nativeService.set(value) 
          .then(() => { 
           console.log('ok'); 
          }) 
          .catch((err) => { throw new Error(); //error that I want to catch 
          }) 
        } 
       } 
       catch (err) { 
        throw new Error(); 
       } 
       return data; 
      }) 
      .catch((err) => this.handleError(err)); 

這nativeService目前嘲笑返回以下

set(value: any): Promise<any> { 
    return new Promise((resolve, reject) => { 
     reject(''); 
    }) 
} 

的數據,雖然返回。然後錯誤被拋出,我無法捕捉它來調用handleError()方法。我明白承諾是一個異步調用。有人可以建議如何重新安排代碼以捕獲服務返回的錯誤。

感謝, 阿什利

+0

它是'set(value)'還是'set(data)'? –

+0

@suraj是設置數據。 – ashley

回答

1

這不是你如何從可觀察到的返回數據。這裏不能使用簡單的return data種語句。此外,您已經在返回可觀察值,因此您希望這些數據會在哪裏出現?

對於要返回的數據,您實際上會創建一個新的observable並將觀察者放在收到的數據上。

讓我糾正你的代碼:

return Observable.create((observer) => { 
this.http.get(url) 
.map(res => res.json()) 
.subscribe((data) => { 
    if (data === "14") { 
    this.nativeService.set(data) 
    .then(() => { 
     console.log('ok'); 
     observer.next(data); 
    }) 
    .catch((err) => { 
     observer.next(err); // Error thrown if some problem in promise. 
    }) 
    } 
    },(err) => { 
    observer.error(err); //Error thrown if problem in http.get(). 
    }); 

現在你已經從認購的部分將有3個輸出。 1.數據2.承諾錯誤(.subscribe的數據中的1和2兩者)和3. http.get()錯誤。因此你必須在那裏管理。

NOTE:我只解決了上述問題。我不知道這一點,我不知道像部分 -

  1. if(data === "14") - 這好像你想將它與14號,而不是字符串「14」進行比較。
  2. http.get()的結果是什麼?如果它返回單個數字值,那就沒問題。
  3. this.nativeService.set(data) - 假設這個承諾正確地返回一切。
+0

謝謝。讓我試試看。 – ashley

+0

謝謝,你的代碼給了我開始解決我的特殊問題:-) – jrierab