#rxjs6 #combinelatest
#rxjs6 #combinelatest
Вопрос:
это код
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}`
);
}
);
это определение для combineLatest() в 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:
Ваши таймеры сначала выдадут [1s, 2s, 3s] и будут продолжаться со скоростью 4s.
Таким образом, первый раз, когда все потоки будут выданы, происходит через 3 секунды.
Следующими событиями combineLatest
(когда все потоки отправлены и любой из потоков отправит новое событие) являются: 5s, 6s, 7s…
Вот иллюстрация для
const timerOne = timer(100, 400);
const timerTwo = timer(200, 400);
const timerThree = timer(300, 400);
combineLatest(timerOne, timerTwo, timerThree, (...arr)=>arr.join('-'));
И это игровая площадка для combineLatest с таймерами
Надеюсь, это поможет