Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript rx:将阵列展开为多个流_Javascript_Reactive Extensions Js_Rxjs - Fatal编程技术网

Javascript rx:将阵列展开为多个流

Javascript rx:将阵列展开为多个流,javascript,reactive-extensions-js,rxjs,Javascript,Reactive Extensions Js,Rxjs,我有一个包含数组的流,数组的每个元素都有一个id。我需要将其拆分为每个id的流,当源流不再携带id时,这将完成 例如,具有这三个值的输入流序列 [{a:1}, {b:1}] [{a:2}, {b:2}, {c:1}] [{b:3}, {c:2}] 应该返回三条流 a -> 1 2 | b -> 1 2 3 c -> 1 2 其中a已在第三个值上完成,因为其id已消失;c已在第二个值上创建,因为其id已出现 我在尝试团拜,有点像 var input = f

我有一个包含数组的流,数组的每个元素都有一个id。我需要将其拆分为每个id的流,当源流不再携带id时,这将完成

例如,具有这三个值的输入流序列

[{a:1}, {b:1}]    [{a:2}, {b:2}, {c:1}]     [{b:3}, {c:2}]
应该返回三条流

a -> 1 2 |
b -> 1 2 3
c ->   1 2
其中a已在第三个值上完成,因为其id已消失;c已在第二个值上创建,因为其id已出现

我在尝试团拜,有点像

 var input = foo.share();              
 var output = input.selectMany(function (s) {
                        return rx.Observable.fromArray(s);
                }).groupByUntil(
                        function (s) { return s.keys()[0]; },
                        null,
                        function (g) { return input.filter(
                                function (s) { return !findkey(s, g.key); }
                        ); }
                )
因此,按id分组,并在输入流不再具有id时处理组。这似乎可行,但输入的两种用法在我看来很奇怪,就像使用单个流控制GroupByTill的输入和组的处理时可能存在奇怪的顺序依赖性

有更好的办法吗

更新

这里确实存在一个奇怪的时间问题。默认情况下,fromArray使用currentThread调度程序,这将导致来自该数组的事件与来自输入的事件交错。然后在错误的时间(在处理以前输入的组之前)评估组上的dispose条件


一种可能的解决方法是使用fromArray(..,rx.Scheduler.immediate),这将使分组事件与输入保持同步。

是的,我能想到的唯一替代方法是自己管理状态。但我不知道这样更好

var d = Object.create(null);
var output = input
    .flatMap(function (s) {
        // end completed groups
        Object
            .keys(d)
            .filter(function (k) { return !findKey(s, k); })
            .forEach(function (k) {
                d[k].onNext(1);
                d[k].onCompleted();
                delete d[k];
            });
        return Rx.Observable.fromArray(s);
    })
    .groupByUntil(
        function (s) { return s.keys()[0]; },
        null,
        function (g) { return d[g.key] = new Rx.AsyncSubject(); });