【问题标题】:Can i convert setTimeout method to observable.timer?我可以将 setTimeout 方法转换为 observable.timer 吗?
【发布时间】:2019-01-23 06:56:01
【问题描述】:

听说我正在迭代数组,我想每 2 秒运行一次这个循环。

 let Array = [1,2,3,4,5,6]  
      for (i = 0; i < Array.length; i++) {
          setTimeout((item)=>{
           //business logic
          console.log("item", item);
          }, 2000 * i, Array[i]);
    }

如何在 observable.timer 方法中转换这段代码?

【问题讨论】:

    标签: angular timer observable


    【解决方案1】:

    这应该有效:

        let Array = [1,2,3,4,5,6]
    rxjs.interval(2000)
    .pipe(
        rxjs.operators.take(Array.length),
        rxjs.operators.map(i => Array[i])
    ).subscribe(value => console.log(value));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.3.3/rxjs.umd.min.js"&gt;&lt;/script&gt;

    它会在 Array.length 项目 (take) 之后自动结束,并生成订阅中的项目 (map) 而不是它们的索引。

    RxJS v5 版本:

        let Array = [1,2,3,4,5,6]
    Rx.Observable.interval(2000)
    .take(Array.length)
    .map(i => Array[i])
    .subscribe(value => console.log(value));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.12/Rx.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 你没有按索引的倍数增加间隔。
    • 我不需要。 OP 的时间间隔都在同一时间开始,因此它每两秒产生一个值。我的也是这样。
    • @tkausl 感谢您的快速回复。我尝试了第二个,但根据场景值应该每 2 秒后控制台。这没有触发。请帮助完成逻​​辑谢谢。
    • @NeerajShrimali 你说得对,我误解了debounce 运算符。第一个虽然有效。
    • @tkausl 此地图仅适用于 rxjs 6+ 版本,关于 rxjs 5 版本的任何想法,我该如何实现。
    【解决方案2】:

    干得好,应该有一个带有 rxjs 6.x 的 es6 版本:

    import { interval } from 'rxjs';
    import { take, map } from 'rxjs/operators';
    
    const array = [2, 3, 4, 5, 6];
    interval(2000)
      .pipe(take(array.length))
      .pipe(map(i => array[i]))
      .subscribe(
        val => console.log(val)
      );
    

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2020-06-30
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多