Увеличение задержки над потоком? - PullRequest
0 голосов
/ 01 января 2019

У меня есть следующее, и оно работает, оно продолжает увеличивать задержку и, в конечном итоге, время ожидания, что я и хотел.

Но поскольку я использую Concatmap, я теряю исходное значение из интервала.

   let x = 1
    let source2$ = interval(500)
      .pipe(

        concatMap(() => {
          x++
          let newtime = x * 500
          console.log("newtime ", newtime)
          return of(5).pipe(delay(newtime))
        }),
        timeout(3000),
        map((data) => {
          return 'Source 2: ' + data
        })
      )

, поэтому он печатает источник 2: 5 .. где я хочу, чтобы он напечатал значение интервала.

Я получил то, что хотел, используя concatmap, но я думаю, что этонеправильный оператор, поскольку я теряю исходное значение.

Может ли кто-нибудь помочь?

Дополнительная информация

Подводя итог, все яхотел бы сделать, чтобы значения выводились с использованием интервала и после каждого выброса увеличивали время задержки - в конце концов он достигает тайм-аута 3000 мс и выводит ошибки.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

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

concatMap(index => {
  let newtime = index * 500
  console.log("newtime ", newtime)
  return of(index).pipe(delay(newtime))
}),

Обратите внимание, что я возвращаю значение обратно в потокна of(index).

Я думаю, я понимаю, что вы беспокоились о возвращении другой наблюдаемой.Так как вы хотите испускать элементы в последовательности (испускать один только после завершения предыдущего), вы должны использовать concatMap с другим внутренним Observable.Не существует специального оператора только для этой функции, потому что это «составное поведение», что означает, что вы можете достичь этого поведения, комбинируя существующие операторы.

0 голосов
/ 01 января 2019
const source2$ = interval(500)
      .pipe(
        map(x => x * 500),
        switchMap(x => timer(x)),
        timeout(3000),
        map(data =>  'Source 2: ' + data)
       )

ОБНОВЛЕНИЕ: https://stackblitz.com/edit/rxjs-iywcm6?devtoolsheight=60

const source2$ = interval(500)
      .pipe(
        tap(x => console.log('Tick before delay', x)),
        concatMap(x => timer((x + 1) * 500).pipe(mapTo(x))),        
        tap(x => console.log('Tick after delay', x)),
        map(data =>  'Source 2: ' + data),
        timeout(3000)
       ).subscribe(
         (data) => console.log(data),
         e => console.error('Timeout', e))
...