import { combineLatest } from 'rxjs';
const observable_1 = get_first_observable();
const observable_2 = get_second_observable();
console.log('first log', observable_1, observable_2);
observable_1.subscribe(e => console.log('second log', e));
observable_2.subscribe(e => console.log('third log', e));
const combined = combineLatest(observable_1, observable_2);
console.log('fourth log', combined);
combined.subscribe(e => console.log('fifth log', e)); // throws TypeError warning, doesn't work
我有一部分代码的行为与上面一样,直到昨天,当我对不相关的代码进行了一些更改时,它仍然可以正常工作。
first log
确认这两个变量确实都是Observables
。
second log
和third log
确认每个observable都发出至少一个值。
fourth log
确认combineLatest()
返回的是Observable
类型。
fifth log
永远不会触发,并且注释掉该行会消除警告。我尝试执行combined.subscribe()
的任何地方都会引发以下TypeError警告。
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
这是怎么回事?我尝试了所有我能想到的一切,但没有成功。在我看来,如果我将两个有效的Observable传递给combineLatest()
,并且它们各自发出一个值,则它应该可以正常工作。
根据要求,两个可观察值的来源如下:
import { BehaviorSubject } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
const get_first_observable = () => {
const subject = new BehaviorSubject<string>(null);
// I am using subject.next(...) elsewhere
return subject.asObservable().pipe(distinctUntilChanged());
};
const get_second_observable = () => {
// where store is a redux Store
const store_subject = new BehaviorSubject(store.getState());
store.subscribe(() => {
store_subject.next(store.getState());
});
const stream = store_subject.asObservable();
const my_observable = stream.pipe(
map(state => {
return format_data(state) || [];
})
);
return my_observable;
};
好的,新的更新。
这对我来说真的很奇怪,我一点也不理解,但是我在get_second_observable()
内的下面添加了一行代码,然后返回my_observable
,然后神奇地完成了所有代码。现在,如果我注释掉该行,它将不再起作用。。这有什么意义?我不会将新的observable保存到变量中,也不会使用它。仅仅将它们组合起来似乎会使它沿链工作。
combineLatest(my_observable, of(true));
答案 0 :(得分:1)
更改:
import { combineLatest } from 'rxjs/internal/observable/combineLatest';
收件人:
import { combineLatest } from 'rxjs';
为我修复了错误:
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
虽然您已经正确导入了,但未显示的代码可能导入不正确。正如其他人所述,您提供的代码没有明显的问题。