【发布时间】:2019-04-28 23:14:08
【问题描述】:
我正在研究 RXJS 并遇到了一个问题:带有运算符“reduce”和“scan”的相同代码以不同的方式工作,但我认为必须返回相同的结果。 下面的例子。 请帮忙。
const txtElement1 = document.getElementById('txt1');
const txtElement2 = document.getElementById('txt2');
const txtElement3 = document.getElementById('txt3');
// function return Observable
function get(array, initValue) {
return Rx.Observable.create(observer => {
let timer = initValue;
array.forEach(item => {
setTimeout(() => observer.next(item), timer);
timer += 1000;
});
});
}
// 1) don't work with "reduce"
var stream1$ = get(['John', 'Ann', 'Bob'])
.reduce(function(acc, x) {
return acc + ` ${x}`;
}, 'first - ');
stream1$.subscribe(text => txtElement1.innerHTML = text);
// 2) the same code, but with "scan" - working
var stream2$ = get(['John', 'Ann', 'Bob'])
.scan(function(acc, x) {
return acc + ` ${x}`;
}, 'second - ');
stream2$.subscribe(text => txtElement2.innerHTML = text);
// 3) and the simple Observable with "reduce" - working
var stream3$ = Rx.Observable.from(['John', 'Ann', 'Bob'])
.reduce(function(acc, x) {
return acc + ` ${x}`;
}, 'third - ');
stream3$.subscribe(text => txtElement3.innerHTML = text);
【问题讨论】:
-
如果它和其他语言一样,
scan和reduce做同样的事情,除了它返回所有中间累加器而不是最后一个。文档应该能够为您解答这个问题。 -
我不认为 StackOverflow 仅适用于其他任何地方都找不到的信息。
-
@Carcigenicate 我并没有说它们工作相同。我说我期待同样的结果。例如,第三个示例对两个运算符的工作方式相同。但第一个不是。区别仅在于函数“setTimeout”。不幸的是,文档没有说明任何内容。
-
reduce运算符仅在其源 observable 完成时才发出一个值。第一个示例中的 Observable 不完整,这就是原因。尝试将observer.complete()添加到get返回的observable。
标签: javascript rxjs