[RxJS] generate

generate 是 RxJS 裡面的 for loop 方法,這樣的描述應該夠簡單明瞭了

基本用法

這是 JavaScript for loop 的寫法

1
2
3
for(let i=0; i< 100; ++i){
...
}

而這是 RxJS 使用 generate 的寫法

1
generate(0, x=> x< 100, x=> ++x)

generate 介面

1
generate<T, S>(initialStateOrOptions: S | GenerateOptions<T, S>, condition?: ConditionFunc<S>, iterate?: IterateFunc<S>, resultSelectorOrObservable?: (ResultFunc<S, T>) | SchedulerLike, scheduler?: SchedulerLike): Observable<T>

變化用法

with resultSelector

1
2
3
4
5
const source = generate(0, x => x < 10, x => ++x, x => x + '!!');

source.subscribe({
next: v => console.log(v)
})

輸出結果

1567578743411

串接其他 observable

  • with from

    1
    2
    3
    4
    5
    6
    7
    const source = from(['a', 'b', 'c']).pipe(
    concatMap((value) => generate(0, x => x < 3, x => ++x, x => value + '-' + x))
    )

    source.subscribe({
    next: v => console.log(v)
    })

    1567579046848

  • double generate

    1
    2
    3
    4
    5
    6
    7
    8
    const source = of(['a', 'b', 'c', 'd']).pipe(
    concatMap((value) => generate(0, x => x < value.length, x => ++x, x => value[x] + '-' + x)),
    concatMap((value) => generate(0, y => y < 3, y => ++y, y => value + '-' + y))
    )

    source.subscribe({
    next: v => console.log(v)
    })

    1567579775214

range 效果

RxJS 裡面原本就有一個 range 的 observable,但是卻沒有辦法設定 step,這時候就可以使用 generate 來完成這件事情

1
2
3
4
5
const source = generate(0, x => x < 10, x => x + 2)

source.subscribe({
next: v => console.log(v)
})

1567580096145

參考資料