Как заказать слияние потоков?

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

  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 функция.

Другие вопросы по тегам