将 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
基于 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