javascript - 为什么reduce的行为与手写的链式方法不同?

标签 javascript rxjs observable

我认为Rx.Observable.prototype.reduce就像Array.prototype.reduce所以我这样写代码

        function fn(prev, num){
            return Rx.Observable.of(prev+num);
        }

        fn(1, 1).switchMap(res =>fn(res, 2))
                .switchMap(res =>fn(res, 3))
                .subscribe(x=>console.log(x));

        // 7 



        Rx.Observable.from([2,3]).reduce(
            (prev, cur) =>prev.switchMap(res => fn(res, cur)),
            fn(1, 1)
        ).subscribe(x=>console.log(x))

        // SwitchObservable {source: FlatMapObservable}

我想知道为什么我不能以这种方式使用扫描?如何正确使用 Operator?

最佳答案

这是因为你的累加器是一个 Observable。您可以通过再次调用 switchMap 来获取您的值:

Rx.Observable.from([2,3]).scan(
    (prev, cur) =>prev.switchMap(res => fn(res, cur)),
    fn(1, 1)
).last().switchMap(x => x).subscribe(x=>console.log(x))

编辑后

Rx.Observable.from([2,3]).reduce(
    (prev, cur) =>prev.switchMap(res => fn(res, cur)),
    fn(1, 1)
).switchMap(x => x).subscribe(x=>console.log(x))

关于javascript - 为什么reduce的行为与手写的链式方法不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41279031/

相关文章:

javascript - 使用 jQuery 将 div 滑入滑出

javascript - 如何在关闭另一个窗口后打开一个弹出窗口?

javascript - (reactjs) 获取子组件值

typescript - 如何声明 Rx.Observable.fromPromise() 的 TypeScript 返回类型

javascript - Angular:触发间隔观察

javascript - 具有不同模板的 Web 应用程序 (AngularJS)

angular - 如何防止在 Angular 中双击?

angular - 如何在 Angular 6 中再次触发 HttpGet 请求?

angular - 仅当 Rxjs 轮询上的某些属性发生更改时才调度 NgRx 操作

angular - 如何从 Angular 7 中的 Observable 返回对象