Прошу прощения, что я не кодовый код javascript, но это работает в .NET. Надеюсь, вы сможете перевести.
var xs = new Subject<string>();
var ys = new Subject<string>();
var qs =
xs.Publish(pxs =>
ys.Buffer(() => pxs)
.Zip(pxs, (numbers, letter) => new { letter, numbers }));
.Publish(pxs =>
оператор принимает один наблюдаемый, выписывает ему только один раз и акций, что подписка в лямбда. Он предотвращает множественные подписки источника и синхронизирует производство значений от pxs
в пределах лямбда.
ys.Buffer(() => pxs
принимает все значения ys
и преобразует значения в ряд списков, разбитых в точке, когда pxs
производит значения.
И наконец, .Zip(...)
принимает значения от pxs
и связывает их со списками, произведенными .Buffer(...)
.
qs.Subscribe(q => Console.WriteLine(q));
ys.OnNext("1");
ys.OnNext("2");
ys.OnNext("3");
xs.OnNext("A");
ys.OnNext("4");
ys.OnNext("5");
ys.OnNext("6");
ys.OnNext("7");
ys.OnNext("8");
xs.OnNext("B");
ys.OnCompleted();
xs.OnCompleted();
Он производит:
Вот переведенный Javascript версия:
var qs = xs.publish(
pxs =>
ys.buffer(() => pxs).zip(pxs, (numbers, letter) => [ letter, numbers ])
);
Я думаю, что код совместим (кроме генераторов) с JS :) Единственная проблема, моя диаграмма путала вас, и мне нужно немного другое поведение.Пожалуйста, проверьте обновленную диаграмму или другой ответ –
kharandziuk
Спасибо. оно работает. переведенная версия http://pastebin.com/Pcyi3u6t – kharandziuk
Упрощенный yestreday :) Я приму это вечером, если @ user3743222 не возражает. Технически он предложил действительное решение раньше – kharandziuk