如何在RxJs流中找到哪个初始值产生错误

时间:2016-01-17 22:21:56

标签: node.js typescript 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 个答案:

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