角度:触发间隔可观察

时间:2017-12-14 14:36:43

标签: javascript angular rxjs observable

如何触发interval-observable在定义的时间间隔之外执行其操作但保持间隔按照定义运行?

示例:

Intervall是10秒。我喜欢不仅在intervall中调用 doit ,而且如果事件发生了 - 请按一下按钮。

当然我可以在按钮处理程序中调用doit但是有一种方法我可以使用obervable(例如 obs.trigger()的那种)吗?

export class MyComponent implements OnInit
{
    private obs : any;   // the observable instance

    ngOnInit ()
    {
        this.obs = Observable.interval (10 * 1000)
            .startWith (0)
            .subscribe ((n) => 
            {
                doit ();
            });
    }

    doit ()
    {
       // some action
    }

    clicked ()
    {
        doit ();   // works but I am looking for a way to do it with obs
    }
}

谢谢!

3 个答案:

答案 0 :(得分:3)

我不认为这是可能的,因为你根据间隔创建了observable。

但是,如果你想要观察,你可以像这样创建它

<button (click)="obs.next($event)">

private obs = new Subject();
public obs$ = this.obs.asObservable();

而不仅仅是像这样组合observable

first.concat(second).subscribe(res => console.log(res));

所以我建议创造两个服从而不是将它们结合起来。你已经拥有了一个并为按钮点击创建了一个,而不是组合它们。

<button (click)="obs.next($event)">

private obsButtonClick = new Subject();
public obs$ = this.obsButtonClick.asObservable();

ngOnInit ()
{
    this.obs = Observable.interval (10 * 1000)
        .startWith (0);

     this.obs.concat(obsButtonClick).subscribe ((n) => 
        {
            doit ();
        });
}

答案 1 :(得分:2)

您可以使用merge运算符组合两个可观察对象。您的间隔加上一个fromEvent点击可观察。

textLength

这是一个stackblitz演示。

答案 2 :(得分:-1)

我看是否只是执行

clicked ()
{
  this.obs.next ();
}

它按预期工作。

我看不到有负面影响吗? 因为你的答案稍微复杂一点,我害怕错过什么?