如何找到 RxJs 流中的哪个初始值产生了错误
How to find which initial value in an RxJs stream produced an error
我有一项服务 returns 电子邮件地址的邮件服务器列表:
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
答案似乎是您不能按照我期望的方式执行此操作。您必须在 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 } );
} );
}
然后在我的另一个 class 中您可以访问 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 )
);
我有一项服务 returns 电子邮件地址的邮件服务器列表:
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
答案似乎是您不能按照我期望的方式执行此操作。您必须在 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 } );
} );
}
然后在我的另一个 class 中您可以访问 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 )
);