The good with rxjs is that it is easy to compose custom operators from existing ones. e.g. in your case the delayPerElement
operator:
import { delay, concatMap, of, map } from 'rxjs';
//Compose a custom operator
const delayPerElement = (delayMs)=>concatMap(x => of(x).pipe(delay(delayMs)))
from([1,2,3,4,5])
.pipe(delayPerElement(1000))
.subscribe(x=>console.log(x))
output: (a number is printed every second)
1
2
3
4
5
You can go further and create a delayedMap
//Compose a custom operator
const delayedMap = (mapperFunc, delayMs)=>pipe(map(mapperFunc),delayPerElement(delayMs));
from([1,2,3,4,5])
.pipe(delayedMap(x=>x*2), 1000)
.subscribe(x=>console.log(x))
output: (a number is printed every second)
2
4
5
8
10
or even further with delayedConcatMap
(e.g. useful for delay between web requests)
//Compose a custom operator
const delayedConcatMap = (...args)=>pipe(delayedMap(...args), concatAll());
from([1,2,3,4,5])
.pipe(delayedConcatMap(x=>axios.get(`https://jsonplaceholder.typicode.com/todos/${x}`).then(j=>j.data.title), 1000) )
.subscribe(x=>console.log(x))
output: (a text is printed every second)
delectus aut autem
quis ut nam facilis et officia qui
fugiat veniam minus
et porro tempora
laboriosam mollitia et enim quasi adipisci quia provident illum