当前位置: 首页 > 知识库问答 >
问题:

RxJS:我如何“手动”更新一个可观察的对象?

苏磊
2023-03-14

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

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

// 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
}

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

$( "#target" ).click(function(e) {
  eventObservable.push(e.target.text()); 
});

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

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

共有2个答案

鄂昌胤
2023-03-14

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

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使它更容易,在同一个对象中提供了Observable和Observator,但它并不完全相同,因为Subject允许您在一个Observable只向最后一个订阅的Observator发送数据时订阅多个Observator到同一个Observable,所以要有意识地使用它。如果你想修补它,这里有一个JsBin。

陶博耘
2023-03-14

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

你可以这样做:

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

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

  • https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/subject.md
  • http://reactivex.io/documentation/subject.html
 类似资料:
  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 我已经实现了一个angular应用程序,它请求一个项目列表来填充一个表格。在我的服务中,我有以下函数,它从服务器请求项目列表: 编辑:表获取数据的方式: 在HTML中,我将数据源绑定到mat表

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我正在开发一个Angular应用程序,其中我正在通过HTTP进行rest调用,如下所示: 基本上,我希望我的组件在我的订阅调用中得到响应&错误,即。 如果,如何抛出错误消息,以便在订阅回调的错误参数中访问它?

  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 我正在努力处理一个简单的RxJs查询,但我似乎无法理解。如果观察对象被包装在一个对象中,我似乎不知道如何合并它们。如果我直接从flatMap返回Observable,那么这个示例可以正常工作,但我还需要在输出中输入名称。我怎样才能做到这一点? 我正在使用RxJS 5.0.0-beta.2 基本数据结构: RxJs函数: 预期结果: 实际结果: