CombineLatest не принимает последнее значение в rxjs - PullRequest
2 голосов
/ 04 апреля 2019

это код

const timerOne = timer(1000, 4000).pipe(
  map(x=>`1-${x}-${new Date().getSeconds()}`)
)
//timerTwo emits first value at 2s, then once every 4s
const timerTwo = timer(2000, 4000).pipe(
  map(x=>`2-${x}-${new Date().getSeconds()}`)
);
//timerThree emits first value at 3s, then once every 4s
const timerThree = timer(3000, 4000).pipe(
  map(x=>`3-${x}-${new Date().getSeconds()}`)
);

//when one timer emits, emit the latest values from each timer as an array
const combined = combineLatest(timerOne, timerTwo, timerThree);

const subscribe = combined
.pipe(take(5))
.subscribe(
  ([timerValOne, timerValTwo, timerValThree]) => {   
    console.log(
     ` ${timerValOne},
    ${timerValTwo},
     ${timerValThree}`
    );
  }
);

это определение для функцииlateLatest () в rxjs

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

Теперь, исходя из вышеприведенного определения, вывод должен быть

1-2-56,
2-1-57,
3-0-58

вместо

1-0-56,
2-0-57,
3-0-58

, потому что мы получим только значение timerThree Наблюдаемое через 3 секунды к этому времени самое последнее значение для timerOne будет равно 2, а самое последнее значение для timerTwo будет равно 1, я что-то пропустил, пожалуйста, помогите,спасибо

1 Ответ

1 голос
/ 04 апреля 2019

Ваши таймеры сначала срабатывают через [1 с, 2 с, 3 с] и будут работать с частотой 4 с.

Таким образом, первый раз, когда все потоки будут излучать, будет 3s .

Следующие события в combineLatest (когда все потоки испустили, а любой из потоков испустил новое событие): 5 с, 6 с, 7 с ...

Вот иллюстрация для

const timerOne = timer(100, 400);
const timerTwo = timer(200, 400);
const timerThree = timer(300, 400);
combineLatest(timerOne, timerTwo, timerThree, (...arr)=>arr.join('-'));

timer with combineLatest illustration

А это игровая площадка для комбайнаПоследний с таймерами

Надеюсь, это поможет

...