使用.groupBy和.concatAll的组合对输出进行分组时,不会生成某些预期输出。
示例代码:
var Rx = require('rx');
var source = Rx.Observable.from(['a1', 'a2', 'b1', 'b2', 'a3', 'a4', 'b3', 'b4'])
.groupBy(function (item) { return item.substr(0, 1); })
.concatAll();
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
实际输出:
$ node index.js
Next: a1
Next: a2
Next: a3
Next: a4
Completed
预期产出:
$ node index.js
Next: a1
Next: a2
Next: a3
Next: a4
Next: b1
Next: b2
Next: b3
Next: b4
Completed
我是否误解了这些运营商的运作方式?或者这是一个RxJS错误? (暂时以https://github.com/Reactive-Extensions/RxJS/issues/1264的错误提交。)
答案 0 :(得分:1)
想出来。这是hot vs cold observables的问题。如下更改代码使其按预期工作:
var source = Rx.Observable.from(['a1', 'a2', 'b1', 'b2', 'a3', 'a4', 'b3', 'b4'])
.groupBy(function (item) { return item.substr(0, 1); })
.map(function (obs) { // <<<<< ADD THIS .map clause to fix
var result = obs.replay();
result.connect();
return result;
})
.concatAll();