首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJS:如何“手动”更新可观察对象?

RxJS:如何“手动”更新可观察对象?
EN

Stack Overflow用户
提问于 2015-10-25 06:57:04
回答 2查看 93.7K关注 0票数 161

我想我一定是误解了一些基本的东西,因为在我看来,这应该是一个可观察对象的最基本的情况,但在我的一生中,我无法从文档中找出如何做到这一点。

基本上,我希望能够做到这一点:

代码语言:javascript
复制
// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
   function(x){
     console.log('next: ' + x);
   }
...
var my_function = function(){
  eventObservable.push('foo'); 
  //'push' adds an event to the datastream, the observer gets it and prints 
  // next: foo
}

但是我还没有找到像push这样的方法。我将其用于单击处理程序,我知道他们有用于此的Observable.fromEvent,但我正在尝试将其与React一起使用,并且我更希望能够在回调中简单地更新数据流,而不是使用完全不同的事件处理系统。所以基本上我想要的是:

代码语言:javascript
复制
$( "#target" ).click(function(e) {
  eventObservable.push(e.target.text()); 
});

我得到的最接近的方法是使用observer.onNext('foo'),但这似乎没有实际工作,这是在观察者身上调用的,这似乎是不正确的。观察者应该是对数据流做出反应的东西,而不是改变它,对吗?

我只是不理解观察者/观察者之间的关系吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-27 05:48:41

在RX中,观察者和可观察者是不同的实体。观察者订阅一个可观察对象。可观察对象通过调用观察者的方法向其观察者发出项。如果需要在Observable.create()作用域之外调用观察者方法,可以使用Subject,它是同时充当观察者和可观察者的代理。

你可以这样做:

代码语言:javascript
复制
var eventStream = new Rx.Subject();

var subscription = eventStream.subscribe(
   function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

var my_function = function() {
  eventStream.next('foo'); 
}

您可以在此处找到有关主题的更多信息:

票数 170
EN

Stack Overflow用户

发布于 2017-01-10 05:40:33

我相信Observable.create()不会将观察者作为回调参数,而是发射器。因此,如果您想向您的可观察添加一个新值,请尝试执行以下操作:

代码语言:javascript
复制
var emitter;
var observable = Rx.Observable.create(e => emitter = e);
var observer = {
  next: function(next) {
    console.log(next);
  },
  error: function(error) {
    console.log(error);
  },
  complete: function() {
    console.log("done");
  }
}
observable.subscribe(observer);
emitter.next('foo');
emitter.next('bar');
emitter.next('baz');
emitter.complete();

//console output
//"foo"
//"bar"
//"baz"
//"done"

是的,Subject让它变得更简单,在同一个object中提供了Observable和easier,但它并不完全相同,因为Subject允许你在一个observable只向最后一个订阅的观察者发送数据时订阅多个观察者,所以要有意识地使用它。这是一个JsBin,如果你想修改它的话。

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33324227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档