如何找到 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 )
    );