我有一项服务可以返回电子邮件地址的邮件服务器列表:
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
答案 0 :(得分: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 )
);