Typescript rxjs :是否有 settimeout 0 的干净替代品

fir*_*baa 12 javascript rxjs typescript ecmascript-6 angular

在我的角度应用程序中,我正在使用这种处理方法

myMethod(){
 ...
 setTimeout(() => {
      this.router.navigate(['mucomponent']);
 });
}
Run Code Online (Sandbox Code Playgroud)

正如我被告知的:setTimeout 没有延迟(0)似乎等待下一个蜱虫完成所有治疗后开始我的治疗。这是近期的计划。

因为我需要这种行为

是否有任何干净的替代方法可以用typescriptrxjs做同样的事情来做得更好?

建议?

geo*_*-un 14

尽管所接受的答案在技术上可能可行,但它远非理想。RxJS 团队asapScheduler正是为此用例创建的。

asapScheduler.schedule(() => this.router.navigate(['mucomponent']));
Run Code Online (Sandbox Code Playgroud)

来自RxJS 文档

asap 调度程序将尽力缩短当前执行代码结束和计划任务开始之间的时间。这使得它成为执行所谓“延迟”的最佳候选者。传统上,这是通过调用 来实现的setTimeout(deferredTask, 0),但该技术涉及一些(尽管最小)不需要的延迟。


Ban*_*i29 11

可以使用Interval或者接收rxjs;

import { interval } from 'rxjs';
import { take} from 'rxjs/operators';

myMethod() {
  interval(0).pipe(take(1),
   ).subscribe(value =>
    this.router.navigate(['mucomponent']);
}
Run Code Online (Sandbox Code Playgroud)


Stv*_*dll 10

这应该可行,并且比以前的解决方案更简单:

timer(0).subscribe(time => this.router.navigate(['mucomponent']));
Run Code Online (Sandbox Code Playgroud)

timer() 有 2 个参数,第二个参数是可选的。如果提供2个参数,第一个参数是延迟,第二个参数是周期。如果只提供一个参数,那就是延迟,定时器只会发出 1 个值(不会重复)。

来自timer()的文档:

如果未指定 period(第二个参数),则输出 Observable 仅发出一个值 0。

参考: https: //rxjs-dev.firebaseapp.com/api/index/function/timer