typescript - 在 rxjs 中创建一个无休止的重复任务
问题描述
我有一个长时间运行的任务,我想在 TypeScript 中永远循环。
它应该只在前一个任务完成时运行下一个任务。
我想为此使用 rxjs,因为它似乎是最简洁的方法。
到目前为止,我已经使用了间隔、队列调度程序、延迟、排气和排气映射的组合,但运气不佳。
这是我到目前为止所拥有的:
function longTask () : void {
// some long running task
}
interval(1000)
.pipe(
exhaustMap((x) =>
defer(()=> longTask())
)
.subscribe();
提前致谢。
解决方案
使用 zip,zip 将触发间隔,然后等待您的 observable 触发。
zip(interval(1000), longTask()).subscribe(([_, longTaskResult]) => {
});
或者,如果您的 longTask 只发出一次并完成,您可以进行递归调用
const { of } = rxjs;
const { delay } = rxjs.operators;
const longTask = () => of(Math.random() * 10).pipe(delay(Math.floor(Math.random() * 5000)));
const runLongTask = () => {
longTask().subscribe(result => {
console.log(result);
runLongTask();
});
}
runLongTask();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>
推荐阅读
- angular - 在 github 页面上部署 Angular 应用程序后,图像未加载
- android - 有没有办法从 UNITY 5.6.6 发布 API 级别 26 的 Android 应用程序?
- forms - 自定义表单约束抛出空指针异常
- ansible - 在 Ansible 中使用处理程序失败时如何处理回滚?
- extjs - ExtJS:在分组组合框 tpl 中动态传递组名
- arrays - 使用 joi 验证字符串数组,必须是字符串
- java - 在 Postgres 中使用 XML 列保存 JPA 实体模型
- html - 如何快速检查不同浏览器尺寸的布局?
- jquery - 如何修复适用于 console.log() 但代码不正确的 jQuery 媒体查询
- ios - Xcode 10.2 访问FrameworkSDK时使用未声明标识符错误