我需要类似于withLatestFrom的东西,它对应于下图:
---------A-----------------B--
-1-2-3------4------5-6-7-8----
--------[A,[123]]---------------[B,[45678]]
有没有办法用RxJS实现这种行为?
最佳答案
抱歉,我不是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 =>
运算符采用一个可观察的对象,仅订阅一次,并在lambda中共享该订阅。它防止源的多个预订,并在lambda中同步来自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 ])
);