Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在RxJs中收到流错误后如何继续_Node.js_Typescript_Rxjs - Fatal编程技术网

Node.js 在RxJs中收到流错误后如何继续

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

我在Node.js中有一个服务,用于检索电子邮件地址的邮件服务器:

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编译错误。效果很好。