"减少"和"扫描"之间有什么区别

Ale*_*kin 12 javascript rxjs

我正在研究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)