2016-01-17 67 views
0

我有一個返回郵件服務器的列表的電子郵件地址的服務:如何找到其初始值的RxJs流產生的誤差

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

,我使用這項服務來得到一個郵件服務器聯繫人列表:

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) 
    ); 

除了處理錯誤之外,它的工作原理還不錯。在我的錯誤處理程序中,我想記錄錯誤,但也會產生錯誤的聯繫人。有沒有什麼辦法可以獲得錯誤所涉及的聯繫對象,或者是否必須在包含該錯誤的聯繫人的服務中拋出自定義錯誤?

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

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

回答

1

答案似乎是,你不能在我所期待的方式做到這一點。你必須在mailServerService內處理,並拋出一個自定義錯誤:

lookupMailServers(email): Rx.Observable<contracts.IHasMailServer> { 

    return Rx.Observable.fromNode() 
     .catch((error) => { 
      console.log(`Error getting mail server for domain ${domain} on email ${email.email}: ${error}`) 
      return Rx.Observable.throw<contracts.IHasMailServer>(<contracts.IMxLookupError>{ error: error, hasEmail: email }); 
     }); 
} 

,然後在我的其他類,你可以訪問IMxLookup錯誤:

Rx.Observable.from(contacts).flatMap<contracts.IHasMailServer>((contact) => { 
     return this._mailServerService.lookupMailServers(contact) 
      .retry(3) 
      .catch((error: contracts.IMxLookupError) => { 
       console.log(`Error loading mx servers for email ${error.hasEmail.email}: ${error.error}`); 
       return Rx.Observable.empty<contracts.IHasMailServer>(); 
      }); 
    }).subscribe(
     (result) => this.handleContactWithMailServer(result), 
     (error) => this.handleMailServerError(error) 
    );