как производить значение каждые 1 сек на rxjs - PullRequest
0 голосов
/ 24 декабря 2018

Если у меня уже есть наблюдаемая, то какой оператор я должен использовать, чтобы сделать эту наблюдаемую для получения значения, например, раз в 1 секунду?

// this just an example, In my project, I can't control when the 
// observable will produce value. I can assume that it will produce
// value very fast.
const obs = from([1,2,3,4,5]);

Объекты будут выдавать значение 1,2,3... очень быстро.Но что, если я хочу, чтобы он излучал значение каждые 1 секунду?Я имею в виду, просто убедитесь, что obs испускает значение не слишком быстро?

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

Может кто-нибудь сказать мне, какчтобы сделать наблюдаемую ценность продукта в период времени, а не пропустить или игнорировать значения?

Любая помощь будет признательна!

И извините за мой плохой английский.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вы можете почтовый индекс с интервалом , наблюдаемым следующим образом:

import { zip, from, interval } from rxjs

const obs = zip(
  from([1,2,3,4,5]),
  interval(1000),
  (val, i) => val // Just emit the value
)

obs.subscribe(val => console.log(val))

Если вы хотите, чтобы первое значение генерировалось немедленно, тогда вы можете использовать таймер вместо интервал :

import { zip, from, timer } from rxjs

const obs = zip(
  from([1,2,3,4,5]),
  timer(0, 1000),
  (val, i) => val // Just emit the value
)

obs.subscribe(val => console.log(val))

Вы также можете использовать трубу, если хотите, например:

import { from, interval } from rxjs
import { zip } from rxjs/operators

const obs = from([1,2,3,4,5])
  .pipe(
    zip(interval(1000), val => val)
  )

obs.subscribe(val => console.log(val))
0 голосов
/ 25 декабря 2018

Вы действительно можете использовать delay, но вы должны превратить каждое задержанное значение в наблюдаемое, а затем объединить их в последовательность с concatMap.

from([1,2,3,4,5]).pipe(
  concatMap(v => of(v).pipe(delay(1000))),
)

Вы можете использовать zip, но это будетправильно работать только с тестовыми данными.zip испускается только тогда, когда все исходные Наблюдаемые объекты испускают одинаковое количество предметов.Это означает, что если один Observable испускает очень быстро, затем замедляется, а затем второй Observable начинает излучать быстрее, он испускает быстрее, чем с 1s задержками.Это произойдет, даже когда interval и zip объединены, потому что zip внутренне буферизует все значения, так что он может составлять несколько излучений из interval, а затем переизлучать все их сразу, если вторая Наблюдаемая излучает очень быстро.

0 голосов
/ 24 декабря 2018

вы можете попробовать что-то в этом роде

var source = Rx.Observable
  .range(1, 10)
  .concatMap(function (x) {
    return Rx.Observable
      .of(x)
      .delay(1000);
  })
 .timeInterval();
...