加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – Obepable因错误而关闭

发布时间:2020-12-17 17:08:45 所属栏目:安全 来源:网络整理
导读:我在Angular 2中遇到了Observable的问题. 我将我的组件订阅到一个observable,然后当我的服务有新值时,我的组件会被通知. 问题是当观察者推送错误时,如HTTP错误,我的observable被关闭,所以我的组件不再被通知. 题 即使出现错误,如何让我的组件继续收听我的服
我在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);
}

解决方法

这是预期的行为. According to the documentation,

In an Observable Execution,zero to infinite Next notifications may be delivered. If either an Error or Complete notification is delivered,then nothing else can be delivered afterwards.

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

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);
});

该方法可能根据实际情况而有所不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读