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

RxJS中delayWhen搭配EMPTY Observable为何不发射值?

关于RxJS delayWhen的两个问题解答

问题1:当内部Observable仅发出完成信号时,delayWhen是否仍能正常工作?

不能。delayWhen的核心逻辑是:只有当内部Observable发出至少一个next值时,才会将源Observable的当前值传递给下游。如果内部Observable仅发出complete信号(没有任何next发射),delayWhen不会触发源值的传递,只会在内部Observable完成后,跟随源Observable的完成信号。

问题2:为何测试代码未按预期运行?

你的代码里,delay$是EMPTY.pipe(delay(2000))——EMPTY本身是一个立即发出complete信号的Observable,加上delay(2000)只是延迟了这个complete信号的发射,但全程没有任何next值输出。

对应delayWhen的逻辑:

  • 源Observable a$(of('Hello'))发出Hello后,等待delay$的next信号,但delay$永远不会发射next,所以Hello不会被传递到下游订阅者。
  • 2秒后delay$发出complete,此时delayWhen会解除对当前源值的等待,但因为没有next触发传递,源值还是不会输出。随后源Observable a$也完成,所以订阅者只收到complete信号,输出Complete。

如果要实现“延迟2秒后输出Hello”的预期效果,你需要让内部Observable发出一个next值,比如把EMPTY换成of(0):

import { of, EMPTY } from 'rxjs';
import { delayWhen, delay } from 'rxjs/operators';

const a$ = of('Hello');
// 用of(0)替代EMPTY,确保内部Observable有next发射
const delay$ = of(0).pipe(delay(2000));
const new$ = a$.pipe(delayWhen(() => delay$));

new$.subscribe({
  next: (value) => console.log('Value:', value),
  complete: () => console.log('Complete'),
  error: (err) => console.error('Error:', err),
});

这样2秒后,delay$会先发出0,触发delayWhen传递源的Hello,随后两个Observable都完成,最终会按预期输出Value: Hello和Complete。

内容的提问来源于stack exchange,提问作者David Mason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:55:56