我需要类似于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 - 用LatestFrom缓冲-LMLPHP



这是翻译的javascript版本:

var qs = xs.publish(
    pxs =>
      ys.buffer(() => pxs).zip(pxs, (numbers, letter) => [ letter, numbers ])
);

07-24 17:00