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触发传递,源值还是不会输出。随后源Observablea$也完成,所以订阅者只收到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
相关产品推荐
相关产品推荐

