我正在研究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);
Run Code Online (Sandbox Code Playgroud)
Moh*_*eer 13
从RxJS文档,
扫描
将函数应用于Observable发出的每个项目,按顺序,并发出每个连续的值
降低
将函数按顺序应用于Observable发出的每个项目,并发出最终值
示例代码
扫描
var source = Rx.Observable.range(1, 3)
.scan(
function (acc, x) {
return acc + x;
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Run Code Online (Sandbox Code Playgroud)
对于Observable发出的每个值,扫描顺序发出相应的输出,因此输出将有3个值,范围为1到3,如下所示
Output
Next: 1
Next: 3
Next: 6
Completed
Run Code Online (Sandbox Code Playgroud)
降低
var source = Rx.Observable.range(1, 3)
.reduce(function (acc, x) {
return acc * x;
}, 1)
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Run Code Online (Sandbox Code Playgroud)
Reduce函数将可观察值的值减少到单个值(最终结果)并发出.所以输出如下,
Next: 6
Completed
Run Code Online (Sandbox Code Playgroud)