You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJS合并Observable报错:You provided 'undefined' where a stream was expected

问题分析与解决思路

为什么最初会触发You provided 'undefined' where a stream was expected.错误?

你一开始的写法有个关键问题:refresh$只做了类型声明但没有初始化,默认是undefined。虽然你在TimerObservable的subscribe回调里给它赋值了,但subscribe是异步执行的——当你执行merge(this.refresh$, ...)这行代码时,定时器的回调还没触发,refresh$依然是undefined,这就导致merge收到了一个非Observable的值,直接抛出错误。

修改后的写法为什么能解决问题?

你后来用switchMap重构refresh$的创建逻辑,本质上是把refresh$从一个“待赋值的变量”变成了一个自包含的Observable流:

this.refresh$ = TimerObservable.create(0, (this.storageService.refRate * 500))
  .takeWhile(() => this.interval)
  .switchMap(() => this.funnelService.getStoryFunnels({}).map(response => [...response]));
  • TimerObservable.create会按设定的间隔发射事件(第一个参数0表示立即触发一次)
  • 每次定时器事件触发时,switchMap会调用funnelService.getStoryFunnels获取数据,并把返回的Observable的结果转发出来
  • 这样refresh$从声明时就是一个合法的Observable,不会再出现undefined的情况,merge操作就能正常合并这个流了

补充说明

保留的合并代码逻辑是没问题的:

this.funnels$ = this.funnelService.getStoryFunnels({}).pipe(
  merge(
    this.refresh$, 
    funnelCreation$.pipe(
      filter(funnel => !!funnel),
      map(funnel => [funnel])
    )
  )
);

它会把初始获取的漏斗数据、定时刷新的漏斗数据,以及新创建的漏斗数据合并成一个流,完全符合你的业务需求。

内容的提问来源于stack exchange,提问作者Sandra Willford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:28