首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >combineLatest投掷TypeError

combineLatest投掷TypeError
EN

Stack Overflow用户
提问于 2019-01-08 23:02:30
回答 1查看 1K关注 0票数 3
代码语言:javascript
复制
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确认每个可观测到的值至少发出一个值。

fourth log确认combineLatest()正在返回Observable类型。

fifth log从不触发,注释这一行将删除警告。在我尝试执行combined.subscribe()的任何地方,它都会引发以下TypeError警告。

代码语言:javascript
复制
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

这里发生什么事情??我已经试过了我能想到的一切都是徒劳的。在我看来,如果我将两个有效的观测值传递给combineLatest(),并且每个可观测值都发出一个值,那么它应该会像预期的那样工作。

根据要求,这两个观测数据的来源如下:

代码语言:javascript
复制
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之前,我在下面的代码行中添加了一行代码,然后神奇地所有的代码都工作了。现在,如果我把这句话说回来,它就不再起作用了..那又有什么意义?我根本不把新的可以观察到的变量保存下来,也不使用它。仅仅是把它们结合起来似乎就能让它顺其自然。

代码语言:javascript
复制
combineLatest(my_observable, of(true));
EN

回答 1

Stack Overflow用户

发布于 2019-01-16 20:33:31

改变:

代码语言:javascript
复制
import { combineLatest } from 'rxjs/internal/observable/combineLatest';

至:

代码语言:javascript
复制
import { combineLatest } from 'rxjs';

修正了我的错误:

代码语言:javascript
复制
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54100991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档