代码之家  ›  专栏  ›  技术社区  ›  nks

我可以将setTimeout方法转换为observable.timer吗?

  •  3
  • nks  · 技术社区  · 6 年前

    听说我在迭代数组,我想每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方法中转换此代码?

    2 回复  |  直到 6 年前
        1
  •  3
  •   tkausl    6 年前

    这应该有效:

        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));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.3.3/rxjs.umd.min.js"></script>

    之后自动结束 Array.length 项目( take )并生成subscribe中的项( 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));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.12/Rx.min.js"></script>
        2
  •  0
  •   zhimin    6 年前

    干得好,应该有一个带有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)
      );