Как заказать слияние потоков?
Я хотел бы объединить две карты одного и того же источника, гарантирующие порядок результата. Вот тестовый модуль, который я хотел бы пройти:
const source = xs.of(1,2,3)
const a = source.map(v=>v*10)
const b = source.map(v=>v*100)
const hist:number[] = []
xs.merge(a,b).addListener({
next: v=>hist.push(v),
})
expect(hist).toEqual([10,100,20,200,30,300])
В настоящее время я получаю следующий результат:
Expected value to equal:
[10, 100, 20, 200, 30, 300]
Received:
[10, 20, 30, 100, 200, 300]
2 ответа
Я не эксперт в xstream
Поэтому я не могу предложить вам решение. Тем не менее, я думаю, что могу объяснить, почему вы получаете вывод, который вы получаете, поскольку это обычное явление в других потоковых библиотеках.
У вас есть слияние двух источников. of
оператор гарантирует, что он будет выдавать значения массива в порядке, map
оператор гарантирует, что он будет излучать преобразованные значения в том же порядке, что и полученные значения и т. д. merge(a,b)
не гарантирует, что будет чередоваться значение a и b. Он гарантирует, что он будет передавать значения a по порядку, а b - по порядку, то есть он гарантирует только частичный порядок в результирующем выводе.
Вопрос о том, даны ли какие-либо значения, какие из них излучать, в какое время и в каком порядке относится к календарному планированию. Я не в курсе xstream
в этот момент выставляется интерфейс планировщика, с помощью которого вы можете настроить планирование выдачи значений. Следовательно, вы связаны с расписанием по умолчанию.
Теперь вернемся к тому, почему вы наблюдаете эти значения в таком порядке:
- слияние (а, б) соединяется сначала с
- a немедленно и синхронно выдает все значения из массива
- слияние (а, б) затем соединяется с б
- b выдает сразу и синхронно все значения из массива
Если вы хотите, чтобы значения 1, 2, 3 не передавались синхронно, вам нужно использовать другой оператор, чем of
чтобы сделать это, или создать свою синхронизированную последовательность явно, т.е. испустить 1 в момент времени t0, 2 в момент времени t0+1, 3 в момент времени t0+2.
Принимая подсказку из ответа пользователя 3743222, используя periodic
упорядочить список.
Изменение:
//const source = xs.of(1,2,3)
const source = xs.periodic(1).drop(1).take(3)
... выдает в консоли:
10 100 20 200 30 300
ESNextbin demo.
drop(1)
это один из способов справиться с periodic
начиная с 0
, Можно альтернативно использовать ++v*10
в map
функция.