使用RxJS Observable.from和一个实现可观察接口的对象

时间:2017-08-23 15:38:31

标签: rxjs observable rxjs5

基于RxJS Observable.from()的{​​{3}},听起来你应该能够传递一个实现可观察界面的对象。但是,以下

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

抛出错误

  

未捕获的TypeError:对象不可观察

我的可观察实施是否不正确?或者我误解了from

注意:这是关于Observable界面的更多学术问题 - 我意识到Observable.create()会在上述情况下起作用。

2 个答案:

答案 0 :(得分:2)

你可以“欺骗”RxJS认为你传递它的对象是一个真正的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

答案 1 :(得分:0)

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

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