首页 > 解决方案 > 在 rxjs 中创建一个无休止的重复任务

问题描述

我有一个长时间运行的任务,我想在 TypeScript 中永远循环。

它应该只在前一个任务完成时运行下一个任务。

我想为此使用 rxjs,因为它似乎是最简洁的方法。

到目前为止,我已经使用了间隔、队列调度程序、延迟、排气和排气映射的组合,但运气不佳。

这是我到目前为止所拥有的:

function longTask () : void {
    // some long running task
}

interval(1000)
.pipe(
     exhaustMap((x) => 
         defer(()=> longTask())
     )
.subscribe();

提前致谢。

标签: typescriptrxjs

解决方案


使用 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>


推荐阅读