将 RxJS Observable.from 与实现可观察接口的对象一起使用

Using RxJS Observable.from with an object that implements the observable interface

基于 RxJS Observable.from()docs,听起来你应该能够向它传递一个实现可观察接口的对象。然而,以下

const observable = {
  subscribe(observer) {
    const subscription = someAsyncProcess(res => observer.next(res));

    return {
      unsubscribe() {
        subscription.unsubscribe();
      }
    }
  }
};


Rx.Observable.from(observable)
  .subscribe({
    next(res) {
      console.log(res);
    }
  });

抛出错误

Uncaught TypeError: object is not observable

我的可观察实现不正确吗?还是我误会了from

注意:这更像是一个关于 Observable 接口的学术问题——我意识到 Observable.create() 可以在上述情况下工作。

如果是事件数组,则可以使用 Observable.from,如果是简单对象,则可以使用 Observable.of。它不必实现任何接口。下面的代码在控制台中打印 a

   Rx.Observable.from("a").subscribe(data=> console.log(data));

你可以 "trick" RxJS 通过实现一个 "symbol function" 来认为你传递给它的对象是一个真正的 Observable(我不知道这个的正确名称是什么)。但是,您可能永远不需要在实践中这样做,最好使用 Observable.create.

const Rx = require('rxjs/Rx');
const Symbol_observable = Rx.Symbol.observable;
const Observable = Rx.Observable;

const observable = {
    [Symbol_observable]: function() {
        return this;
    },

    subscribe: function(observer) {
        // const subscription = someAsyncProcess(res => observer.next(res));
        observer.next(42);

        return {
            unsubscribe() {
                subscription.unsubscribe();
            }
        }
    }
};

Observable.from(observable)
    .subscribe({
        next(res) {
            console.log('Next:', res);
        }
    });

这会打印:

Next: 42