Node.js 在RxJs中收到流错误后如何继续
我在Node.js中有一个服务,用于检索电子邮件地址的邮件服务器:Node.js 在RxJs中收到流错误后如何继续,node.js,typescript,rxjs,Node.js,Typescript,Rxjs,我在Node.js中有一个服务,用于检索电子邮件地址的邮件服务器: export interface IHasEmail { email: string; } export interface IHasMailServer extends IHasEmail { mailServers: Array<string> } export interface IMailServerService { lookupMailServers( contact: IHa
export interface IHasEmail {
email: string;
}
export interface IHasMailServer extends IHasEmail {
mailServers: Array<string>
}
export interface IMailServerService {
lookupMailServers( contact: IHasEmail ): RX.Observable<IHasMailServer>;
}
导出接口IHasEmail{
电子邮件:字符串;
}
导出接口IHasMailServer扩展IHasEmail{
邮件服务器:阵列
}
导出接口IMailServerService{
lookupMailServers(联系人:IHasEmail):RX.可观察;
}
我有一个联系人数组(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 )
);
}
检查联系人(联系人:数组):无效{
从(触点)可观察到的Rx.flatMap((触点)=>{
返回此。\u mailServerService.lookupMailServers(联系)
})。订阅(
(结果)=>此.handleResult(结果),
(错误)=>此.handleError(错误)
);
}
在对lookupMailServer的一个调用返回错误之前,这一切正常。此时,不再向HandlerResults返回更多结果
我想记录错误,但继续接收其他联系人的成功结果。我该怎么做
此示例的代码如下所示:
例外情况是
可观察对象的终端事件。如果一个内部的一个错误,那么它将冒泡到外部的可观察的
,并一直转发到下游。您需要捕获
或以其他方式重试
中间异常,就像在同步代码中一样
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 )
);
}
检查联系人(联系人:数组):无效{
从(触点)可观察到的Rx.flatMap((触点)=>{
返回此。\u mailServerService.lookupMailServers(联系)
//如果是冷源,则重试该方法将
//重新调用该方法,以防遇到诸如暂时网络错误之类的情况。
.重试(3)
.catch((错误)=>{
//在此处记录错误消息
//然后返回一个空的可观察对象,该对象将被删除
//在随后的展平过程中。
return isFatal(err)?Rx.Observable.throw(err):Rx.Observable.empty();
});
})。订阅(
(结果)=>此.handleResult(结果),
(错误)=>此.handleError(错误)
);
}
异常是可观测的终端事件。如果一个内部的一个错误,那么它将冒泡到外部的可观察的
,并一直转发到下游。您需要捕获
或以其他方式重试
中间异常,就像在同步代码中一样
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 )
);
}
检查联系人(联系人:数组):无效{
从(触点)可观察到的Rx.flatMap((触点)=>{
返回此。\u mailServerService.lookupMailServers(联系)
//如果是冷源,则重试该方法将
//重新调用该方法,以防遇到诸如暂时网络错误之类的情况。
.重试(3)
.catch((错误)=>{
//在此处记录错误消息
//然后返回一个空的可观察对象,该对象将被删除
//在随后的展平过程中。
return isFatal(err)?Rx.Observable.throw(err):Rx.Observable.empty();
});
})。订阅(
(结果)=>此.handleResult(结果),
(错误)=>此.handleError(错误)
);
}
您需要明确地处理错误。创建一个新的可观察对象来处理它,并将它映射到类似{error:error,result:IHasMailServer}
的对象。然后使用这个可观察对象,通过error==null对其进行过滤,并进行日志记录。按error!=null
并执行流中的任何操作。您需要显式处理错误。创建一个新的可观察对象来处理它,并将它映射到类似{error:error,result:IHasMailServer}
的对象。然后使用这个可观察对象,通过error==null对其进行过滤,并进行日志记录。按error!=空
并在流中执行任何操作。非常好,非常感谢。我确实删除了源参数,因为它产生了Typescript编译错误。很好,很好,谢谢。我确实删除了源参数,因为它产生了Typescript编译错误。效果很好。