javascript - RxJS - 发生错误时可观察对象未完成

标签 javascript angular typescript rxjs reactive-programming

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

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):

An Observable may make zero or more OnNext notifications, each representing a single emitted item, and it may then follow those emission notifications by either an OnCompleted or an OnError notification, but not both. Upon issuing an OnCompleted or OnError notification, it may not thereafter issue any further notifications.`

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

关于javascript - RxJS - 发生错误时可观察对象未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33783967/

相关文章:

javascript - React.unmountComponentAtNode | React.unmountComponentAtNode 15.4.1 |对象不支持属性或方法 'unmountComponentAtNode'

javascript - 箭头函数表达式与普通函数表达式的自动分号插入 (ASI)

javascript - 如何使用来自 silverlight 项目的多个参数调用 javascript 函数?

typescript - 使用 Bazel 自定义规则在 Typescript 中使用 Jest 进行测试

node.js - TS1086 : An accessor cannot be declared in ambient context in Angular 8 application using docker-compose

javascript - 在没有表单或 URL 变量的情况下将所选 DIV 的 ID 传递到下一个 PHP 页面

angular - 是否可以根据条件更改 Angular 中按钮的标签?

html - 在绝对 div 中居中绝对 div

javascript - 从 Spring Boot 转发到特定的 Angular 组件

javascript - 在 Safari 中加载源映射和调试?