代码之家  ›  专栏  ›  技术社区  ›  Sandra Willford

RXJS合并:在需要流的地方提供了“未定义”

  •  0
  • Sandra Willford  · 技术社区  · 7 年前

    我出错了 You provided 'undefined' where a stream was expected. 当我试图合并可观察到的东西时。

    我在这里创建了我的可观察刷新:

    refresh$: Observable<Funnel[]>; 
    

    然后我有一个计时器…

    TimerObservable.create(0, (this.storageService.refRate * 1000))
        .takeWhile(() => this.interval)
        .subscribe(() => {
            this.refresh$ = this.funnelService.getStoryFunnels({}).map(response => [...response]);
        });
    

    然后,当我尝试合并可观察到的数据时,会产生错误:

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

    根据Cozzy的回答更新:

    this.refresh$ = TimerObservable.create(0, (this.storageService.refRate * 500))
        .takeWhile(() => this.interval)
        .switchMap(() =>  this.funnelService.getStoryFunnels({}).map(response => [...response]));
    

    this.funnels$ = this.funnelService.getStoryFunnels({}).pipe(
            merge(this.refresh$, funnelCreation$.pipe(
                    filter(funnel => !!funnel),
                    map(funnel => [funnel])
                )
            )
        );
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   CozyAzure    7 年前

    那是因为 this.funnels$ 还不能观测到 当它被声明时(没有用任何值初始化),因为它只有在计时器被执行之后才会被赋值。但是,声明代码几乎是立即执行的(同步)。这就是为什么你得到一个 undefined

    你应该做的是你可以使用 switchMap 并指定 this.refresh$ 对它:

    this.refresh$ = TimerObservable.create(0, (this.storageService.refRate * 1000))
        .takeWhile(() => this.interval)
        .switchMap(() =>  this.funnelService.getStoryFunnels({}).map(response => [...response]));