интервал () с задержкой на основе значения - PullRequest
2 голосов
/ 13 мая 2019

Каков наилучший способ сделать наблюдаемый интервал, который будет излучать целые числа и каждое новое значение с задержкой этого значения (в секундах)?

interval().subscribe(v => console.log(v))

ожидается:

1  --- after 1 second
2  --- 2 seconds after 1 was emitted
...
37 --- 37 seconds after 36 was emitted
...

Я создал песочницу для вас - https://stackblitz.com/edit/rxjs-task-delay?file=index.ts

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Я сделал это с BehaviorSubject:

import {  BehaviorSubject} from 'rxjs'; 


const sub = new BehaviorSubject(1);

sub.subscribe( val => {
  console.log( val);
  setTimeout( () => {sub.next(val+1);}, val*1000);
  });

Играйте с этим на https://stackblitz.com/edit/rxjs-task-delay-41r4b1

1 голос
/ 13 мая 2019

Когда мы используем mergeMap, все внутренние наблюдаемые подписываются сразу после их создания, поэтому мы не получаем увеличения временных промежутков, потому что interval испускает каждую секунду , поэтому все внутренние наблюдаемые имеют право подписки после того, как источник выбрасывает:

source.pipe(
  mergeMap(num => of(num).pipe(
    delay(num * 1000)
  )
)

emits 1 after 1 sec., inner waits 1 sec 
emits 2 after 1 sec., inner waits 2 sec (1 sec already passed)
emits 3 after 1 sec., inner waits 3 sec (2 secs already passed)

Но с concatMap внутренние не подписаны, пока не завершится предыдущий:

source.pipe(
  concatMap(num => of(num).pipe(
    delay(num * 1000)
  )
)

Пример песочницы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...