CombineLatest抛出TypeError

时间:2019-01-08 23:02:31

标签: angular typescript rxjs observable

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

1 个答案:

答案 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.

虽然您已经正确导入了,但未显示的代码可能导入不正确。正如其他人所述,您提供的代码没有明显的问题。