当我从头开始创建一个可观察对象,并让观察者出错,然后完成时,订阅的完成部分永远不会被调用.

var observer = Rx.Observable.create(function(observer){
    observer.onError(new Error('no!'));
    observer.onCompleted();
})

observer.subscribe(
    function(x) { console.log('succeeded with ' + x ) },
    function(x) { console.log('errored with ' + x ) },
    function() { console.log('completed') }
)

输出为:

errored with Error: no!

我希望是:

errored with Error: no!
completed

如果我将代码更改为调用onNext而不是onError,则可观察对象将正确完成:

var observer = Rx.Observable.create(function(observer){
    observer.onNext('Hi!');
    observer.onCompleted();
})

observer.subscribe(
    function(x) { console.log('succeeded with ' + x ) },
    function(x) { console.log('errored with ' + x ) },
    function() { console.log('completed') }
)

我得到了预期的输出:

succeeded with Hi! 
completed

为什么在发生错误时没有完成?

推荐答案

这是因为错误意味着完成,所以与onCompleted关联的回调永远不会被调用.您可以在此处查看Rxjs可观测项目合同(http://reactivex.io/documentation/contract.html):

一个可观测对象可以发出零个或多个OnNext通知,每个通知代表一个已emits 的项目,然后它可以在这些emits 通知之后发出一个未完成或一个错误通知,但不能同时发出这两个通知.发出未完成或错误通知后,不得再发出任何通知`

对于错误管理,您可以查看以下内容: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/errors.md

Angular相关问答推荐

Angular v12:Uncatch(in promise):ReferenceError:d3 is not defined ReferenceError:d3 is not defined

将kendo—colorpicker的kendo弹出窗口附加到组件''

PrimeNG侧栏清除primeNG消息.为什么?

父母和子元素在17号角不保持同步

路由在全局导航中总是给我/甚至使用相对路径

HTTP POST响应失败Angular 16

Angular 如何观察DOM元素属性的变化?

当可观察到的更改时,异步管道不更新视图

如何将角17中的嵌套组件与独立组件一起使用?

npm install命令在基本Angular 应用程序的天蓝色构建管道中失败

RxJS如何按顺序进行POST请求,只有在前一个完成后才会触发新的请求?

在生产模式下使用带Angular 的 livekit

Angular:如何设置 PrimeNG p-steps 组件中已完成步骤的样式?

如何修复 [Object: null prototype] { title: 'product' }

Angular2 Pipes:输出原始 HTML

当父组件上的变量发生变化时重新加载子组件

Angular 2 - 组件内的 formControlName

在 Angular rxjs 中,我什么时候应该使用 `pipe` 与 `map`

在 webpack 构建中包含 git commit hash 和 date

提交后在Angular 2中重置表单