Rxjs ';fromEvent';总是观察,但是';来自(myArray)和#x27;处理完所有值后终止观察

Rxjs ';fromEvent';总是观察,但是';来自(myArray)和#x27;处理完所有值后终止观察,rxjs,observable,Rxjs,Observable,因此,我对RxJs和可观测数据的理解有点困难 可以解释为什么“fromEvent”总是对一个新事件做出反应,不管有多少时间没有新的值……但是,将新值推送到使用“from”观察的现有数组中,如果它们在此时都是可观察的,并且应该对异步事件作出反应,那么将它们推到一个现有数组中的方式是不一样的,为什么我们需要使用“Subject”来进行分析阵列 我看到我们需要在数组中使用“主题”…但为什么?我想了解原因/机制这有点像问为什么和数组。forEach也不会迭代我通过添加到数组中的项。push,而addEv

因此,我对RxJs和可观测数据的理解有点困难

可以解释为什么“fromEvent”总是对一个新事件做出反应,不管有多少时间没有新的值……但是,将新值推送到使用“from”观察的现有数组中,如果它们在此时都是可观察的,并且应该对异步事件作出反应,那么将它们推到一个现有数组中的方式是不一样的,为什么我们需要使用“Subject”来进行分析阵列


我看到我们需要在数组中使用“主题”…但为什么?我想了解原因/机制

这有点像问为什么和
数组。forEach
也不会迭代我通过
添加到数组中的项。push
,而
addEventListener()
会继续侦听事件,即使在将来很远的时间

由于底层数据结构不同,两者的行为不同

#来自数组

对于
阵列
而言,实现基本上是:

function fromArray(array) {
  return new Observable(observer => {
    try {
      // Iterate through each item in the array and emit it to the Observer
      array.forEach(item => observer.next(item));
      // Array iteration is synchronous, which when we get here we are done iterating
      observer.complete();
    } catch (e) { observer.error(e) }
  })
}
其中,每次订户订阅
可观察对象时,传递给可观察对象的函数都会运行。由于
数组
没有检测对它们的更改的机制,因此无法侦听对本机数组的其他更新(注意:为了简单起见,我忽略了monkey补丁或创建某种替代数组数据类型,它确实支持这类更新)

#fromEvent

另一方面,fromEvent的
看起来更像:

function fromEvent(node, eventName, selector) {
  // Convert the passed in event or just use the identity
  let transform = selector || x => x;

  // Construct an Observable using the constructor 
  return new Observable(observer => {
    // Build a compatible handler, we also use this for the unsubscribe logic
    const nextHandler = (value) => {
      try {
        observer.next(transform(value));
      } catch (e) { observer.error(e); }
    }
    // Start listening for events
    node.addEventListener(eventName, nextHandler);

    // Return a way to tear down the subscription when we are done
    return () => node.removeEventListener(eventName, nextHandler);
  })
  // Shares the underlying Subscription across multiple subscribers
  // so we don't create new event handlers for each.
  .share();
}

在这里,我们只是简单地包装本机事件处理程序(显然,真正的实现比这更健壮)。但是,由于底层源实际上是一个事件处理程序,它确实有一种报告新事件的机制(根据定义,实际上是这样),因此我们将继续永久地获取事件(或者直到我们取消订阅)。

嘿,pauldniels,感谢您花时间回答。。。关于“两者的行为不同,因为底层数据结构不同。”-我认为RxJS的要点是数据结构不可知……这就是为什么可以处理数组、事件、,http调用所有可观察流,而不需要特定的业务逻辑来处理数据结构类型。我猜我错误地认为,从静态/动态数据创建一个可观察对象,它将遵循观察者模式,并在任何更改时通知订阅者…我认为这是RxJS的目的?顺便说一句,我刚刚意识到你是“RxJS正在运行”的paulpdaniels,几天前,我买了这本书,当时我正拼命地想尽快把我的脑袋绕到RxJS上:)@user1806692可以理解的假设,相信我,你不是唯一拥有这本书的人。re:统一的业务逻辑,与其说是让每个数据源以相同的方式运行,不如说是让它们之间有一种统一的行为方式。i、 e.为
阵列可观测
构建的管道可以做与EventObservable中的
相同的事情。观察者不应该关心事件何时只发出它们发出的东西。可以更容易地将这两种工厂方法视为攻击不同的用例
fromArray
用于预屏蔽数据,而
fromEvent
用于传统事件处理程序。如果我们有一个
阵列
,它可以在事件更改时发出(类似于Vue修补程序
阵列
),那么我们可以很容易地为它创建一个可观察的,但由于发射机制可能是一个事件处理程序,我们仍然会在封面下使用
fromEvent
。这有意义吗?还有,希望你喜欢这本书!