來探討一下 RxJS 的 repeat
這個 operator
repeat 的功能
repeat
的功能是當一個Observable
完成時,會重新再subscribe
n
次
使用的方式是
1 | obs.pipe(retry()).subscribe(); |
repeat(count: number: -1)
當不給重複的次數時,將會一直有作用
基本範例
1 | import { of } from 'rxjs'; |
探討
根據上面的簡單介紹,可以知道 repeat
的用法。延伸思考,repeat
的作用範圍是如何定義,而 Observable 所傳出的值是否如果我們所預期的呢? 如果搭配其他的 operator 是否有先後順序的問題?
先來一個簡單的問題,重複取十次值
1 | const source = () => new Promise((resolve)=> resolve(Math.random()*10)); |
順序重要嗎?
根據實驗,順序其實不重要,都會被重新 subscribe
Observable 的值呢
根據實驗,repeat 所使用的 observable 值是第一次發生的結果,這表示,如果想要做到每一次重新啟動都要觸發 source observable 時,就必須使用不同的寫法
-
解法1: 如果想要的效果可以使用 interval 完成,改用 interval + mergeMap(or other map) + take 來完成
-
解法2: 使用
defer
來包 Observable/Promise1
2
3
4
5
6
7
8
9const source = () => new Promise((resolve) => resolve(Math.random() * 10));
defer(() => from(source()))
.pipe(
repeat(10)
)
.subscribe({
next: value => console.log(value)
});
啟動範圍
repeat
會重新 subscribe 所歸屬的 Observable
小結
每一個 operator 都有可以細細品嘗的細節,跟 repeat 類似的 operator 有 repeatWhen
、retry
、retryWhen
,也都可以去看看了解一下