错误

时间:2016-12-26 20:07:21

标签: angular rxjs observer-pattern

我在Angular 2中遇到Observable问题。

我将我的组件订阅到一个observable,然后当我的服务有新值时,我的组件会被通知 问题是当观察者推送错误时,如HTTP错误,我的observable被关闭,所以我的组件不再被通知。

问题
即使出现错误,如何让我的组件继续收听我的服务呢?

示例
这是example

这是我的代码:

组件

constructor(private appService: AppService) {
    //I subscribe my component to an observable
    this.appService.commentsObservable.subscribe((comments) => {
        console.log(comments);
    }, (err) => {
        console.log(err);
    });
}

getComments() {
    //I ask the service to pull some comments
    this.appService.getComments()
}

服务

private commentsObserver: Observer<any>;
commentsObservable: Observable<any>;

constructor() {
    this.commentsObservable = new Observable((observer) => {
        this.commentsObserver = observer;
    });
}

getComments() {
    setTimeout(() => {
        //You will see the result displayed by the component
        this.commentsObserver.next([]);
    }, 0);

    setTimeout(() => {
        //You will see the result displayed by the component
        this.commentsObserver.next([]);
    }, 500);

    setTimeout(() => {
        //You will see the error displayed by the component
        this.commentsObserver.error({_body: 'Nice errroorr'});
    }, 1000);

    setTimeout(() => {
        //You won't see this one, why ?
        this.commentsObserver.next([]); 
    }, 1500);
}

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 According to the documentation

  

在Observable Execution中,可以传递零到无限的下一个通知。如果传递了错误或完成通知,则之后不能传递任何其他内容。

对于上面的代码,它可能是

this.appService
// error is caught, but the observable is completed anyway
.catch((err) => {
    console.error(err)
    return Observable.empty();
})
// re-subscribe to completed observable
.repeat()
.subscribe((comments) => console.log(comments));

但考虑到预期的行为,使用RxJS错误处理来提供具有非严重错误值的连续可观察量是不切实际的。相反,它可能会更改为

setTimeout(() => {
    //You will see the error displayed by the component
    this.commentsObserver.next(new Error('Nice errroorr'));
}, 1000);

this.appService.commentsObservable.subscribe((comments) => {
    if (comments instanceof Error)
        console.error(comments);
    else
        console.log(comments);
});

方法可能因实际情况而异。