javascript - 如何在 takeUntil rxjs 函数之后采取行动
问题描述
因此,如果运行的函数运行时间足够长以触发在计时器上运行的 takeUntil 函数,我试图让布尔值为真。
这是代码
start = this.http.get(environment.shochat_content_creator_set_valid_stream_start).pipe(
tap(() => console.log('Stream start'))
);
poll = this.http.get(environment.check_if_stream_is_active_on_mux).pipe(
tap(() => {
this.streamready = true;
return 0;
}
),
catchError(error => {
console.log(error);
return EMPTY;
})
);
startastream(){
const endtimer = timer(60000);
this.streampollsubscription = this.start.pipe(
switchMap(() => timer(0, 5000).pipe(
tap(() => console.log('Polling every 5s')),
mergeMap(() => this.poll)
)),
takeUntil(endtimer)
).subscribe();
}
本质上,如果 takeUntil 确实被解雇,我希望将布尔值设置为 true。
timeout = true;
我一直在看这个stackoverflow帖子
但事情并没有我想要的那么清楚。
解决方案
您可以使用合并运算符并在条件 ( ) 触发时重用您的takeUntil
条件来创建映射true
值:endtimer
const { Subject, merge } = rxjs;
const { takeUntil, mapTo } = rxjs.operators;
const source$ = new Subject();
const condition$ = new Subject();
// Use the merge to work around your completed observable
const result$ = merge(
// When your condition fires map this event to true
condition$.pipe(mapTo(true)),
// Your already existing pipe in wich the takeUntil lives
source$.pipe(
takeUntil(condition$)
)
)
result$.subscribe(console.log)
source$.next(1);
source$.next(2);
condition$.next();
source$.next(3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>
仅供参考:我不确定此解决方案是否适用于您的应用程序上下文,因为您没有显示timeout
声明和设置的位置。
推荐阅读
- javascript - Axios 参数不起作用,但硬编码的 url 有效?
- c# - 如何在 datagridview c#.net 中使 DataGridViewButtonColumn 的标题不可点击
- javascript - ffmpeg 的问题(不加载歌曲?) - ffmpeg 流:写 EPIPE
- java - Java:如何防止我的函数打印尾随逗号?
- angularjs - 输入和提交的内容仍然连接
- python - 从 DB 触发带有日期时间的预定事件的最佳工具是什么?
- mysql - ERROR 1356 (HY000): View 'mysql.user' references invalid table(s) or column(s) or function(s) or definitioner/invoker of view缺少使用它们的权限
- r - ggplot2:条形图中的y轴缩放问题
- java - 如何在主类中调用数组方法
- authentication - 如何使用cyberark密码验证ansible托管节点