在没有观察者(或订阅者?)的情况下发出可观察对象实例
Observable instance emit without an observer (or subscriber ?)
我在Angular2中使用了observable。据我所知,每个可观察对象实例都有一个观察者(1:1),当我们用observer.next(value)发出一些东西时,我们可以用Observable .subscribe((value) =>{})获得那个值。
var observable = Observable.create(observer => {
observer.next(value);
}
.map(value=>{})
.catch(...)
observable.subscribe(value => {
console.log(value);
})
我怎么能在不知道对应观察者的情况下发出值,因为我想在create函数之外发出值。一个可能的解决方案是保存观察者到一些全局变量,但我认为一个可观察对象应该是足够的。对此有什么建议吗?
你把很多东西混在一起了。可观察对象与观察者不是1:1的关系(更准确地说,是1:n)。如果你希望能够手动发出值,你需要一个Subject
,它同时充当Observable和Observer。实际上,这意味着你可以调用它的next()
方法,它会将值传播给它的所有订阅者(观察者)。
import {Subject} from 'rxjs';
let source = new Subject();
source.subscribe(val => console.log('Observer 1:', val));
source.subscribe(val => console.log('Observer 2:', val));
source.next(42);
source.next('test');
这将打印到控制台:
Observer 1: 42
Observer 2: 42
Observer 1: test
Observer 2: test
查看实时演示:http://plnkr.co/edit/gWMFMnPlLJVDC1pQi8pH?p=preview
阅读更多:
- http://reactivex.io/intro.html <
- https://github.com/Reactive-Extensions/RxJS资源/gh>
- https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md
注意Observable.create()
是一个非常不同的动物。它接受一个函数作为参数,每当新的Observer订阅时,都会调用该函数。这就是为什么它将新订阅的Observer作为参数的原因。在这个函数中,你可以在观察者上调用next()
方法来发送一些默认值,所有订阅者都需要接收。
所以你可能想用Subject
而不是Observable.create()
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何通过JS在不干扰其标记的情况下更改HTML文档中字符串的所有实例
- 如何在不覆盖的情况下添加同一JPanel类的不同实例
- 如何在不选择模式配置参数的情况下,使用mongoose在MongoDB模式实例化中的关联数组/对象中执行foreach
- 是否可以在没有构造函数参数的情况下实例化空对象/对象
- 如何在不使用 jquery 刷新页面的情况下保持在同一 jsp 页面实例上
- 在不创建对象实例的情况下访问原型属性
- 为什么在没有新操作符的情况下创建一个新实例
- 为什么实例没有't在没有prototype关键字的情况下继承添加到构造函数的属性
- Javascript——如何在不使用新运算符的情况下启用静态方法,同时防止使用实例函数
- 在没有观察者(或订阅者?)的情况下发出可观察对象实例
- 如何在不中断同一插件的其他实例的情况下取消订阅事件
- 它会在这种情况下生成100个不同的实例变量吗(JS vs c++) ?
- 如何在不增加子表达式计数的情况下匹配子表达式中的n+实例
- 如何在不指定模型名称的情况下从该模型的实例调用静态Backbone.Model函数
- 如何在不保存的情况下创建水线模型的新实例