2016-01-17 44 views
0

在流recieving出錯後繼續我在Node.js的一種服務,檢索郵件服務器的電子郵件地址:如何RxJs

export interface IHasEmail { 
    email: string; 
} 

export interface IHasMailServer extends IHasEmail { 
    mailServers: Array<string> 
} 

export interface IMailServerService { 
    lookupMailServers(contact: IHasEmail): RX.Observable<IHasMailServer>; 
} 

我有觸點陣列(IHasEmail)和我想檢索整個列表的郵件服務器。到目前爲止,我有這個:

checkContacts(contacts: Array<contracts.IContact>): void { 

    Rx.Observable.from(contacts).flatMap<contracts.IHasMailServer>((contact) => { 
     return this._mailServerService.lookupMailServers(contact) 
    }).subscribe(
     (result) => this.handleResult(result), 
     (error) => this.handleError(error) 
    ); 
} 

這工作正常,直到從lookupMailServer的調用之一返回錯誤。此時沒有更多結果返回到handleResults。

我想記錄錯誤,但繼續從其他聯繫人收到成功的結果。我該怎麼做呢?

這個例子的代碼在這裏可以看到:

https://github.com/Roaders/contact-list-checker/tree/4dd0146449a4be6e703a9b60034231cc4c4bdea3

+1

您需要明確處理錯誤。創建一個處理它的新的observable,並將其映射爲'{error:Error,result:IHasMailServer}'。然後使用這個可觀察值,通過'error == null'過濾它並進行日誌記錄。用'error!= null'過濾它,並在流中做任何你想做的事情。 – mostruash

回答

3

例外是Observables終端的事件。如果一個內部錯誤比它會冒泡到外部並且一直向下遊轉發。您需要catch或其他retry中間異常,就像您在同步代碼中一樣。

checkContacts(contacts: Array<contracts.IContact>): void { 

    Rx.Observable.from(contacts).flatMap<contracts.IHasMailServer>((contact) => { 
     return this._mailServerService.lookupMailServers(contact) 
       //If it is a cold source than retrying the method will 
       //re-invoke the method, just in case you suffered something like a transient network error. 
       .retry(3) 
       .catch((err) => { 
        //Log the error message here 
        //Then return an empty Observable which will get removed 
        //during the subsequent flattening. 
        return isFatal(err) ? Rx.Observable.throw(err) : Rx.Observable.empty(); 
       }); 
    }).subscribe(
     (result) => this.handleResult(result), 
     (error) => this.handleError(error) 
    ); 
} 
+0

完美,非常感謝。我確實刪除了生成Typescript編譯錯誤的源參數。很棒。 – Roaders