Angular 2 RxJS Zip运算符对参数有限制吗?

问题描述 投票:6回答:1

我现在对导致此错误的原因感到迷惑。我正在尝试压缩7个Observable的结果,例如:

var zipped$ = Observable.zip(
    Observable.of({prop1:1}),
    Observable.of({prop2:2}),
    Observable.of({prop3:3}),
    Observable.of({prop4:4}),
    Observable.of({prop5:5}),
    Observable.of({prop6:6}),
    Observable.of({prop7:7})
);

然后将它们与mergeAll()和reduce()合并,例如:

var reduced$ = zipped$.mergeAll().reduce((acc,val) => Object.assign({},acc,val));
reduced$.subscribe(final => console.log(final));

但是我得到这个错误:“类型'{}'上不存在属性'reduce']

要增加混乱:

如果我使用6个值,则可以正常工作。

如果可观察对象都返回原语,则可以正常工作。

如果我将此函数添加为zip中的最后一个参数:

function(...args: any[]) {
    // I have no ieda why I need this hack, but the zip fails without it.
    return args;
}

效果很好。

这是RxJS中的错误吗?我是否缺少有关zip实现的信息?这是一个有角度的编译器吗?没有大量的搜索文档显示zip参数的数量限制。任何见解都受到赞赏。

谢谢

编辑:对于发现此问题的任何人。

最佳解决方法是将可观察对象粘贴到数组中并将其作为单个参数提供,例如:

var zipped$ = Observable.zip(...[
    Observable.of({prop1:1}),
    Observable.of({prop2:2}),
    Observable.of({prop3:3}),
    Observable.of({prop4:4}),
    Observable.of({prop5:5}),
    Observable.of({prop6:6}),
    Observable.of({prop7:7})]);

也可以。编辑:数组供稿停止工作,现在需要使用扩展运算符和数组。

javascript angular rxjs
1个回答
0
投票
[自2017年以来,很多事情发生了变化,rxjs文档如今非常好,涵盖了人们可能想要的几乎所有内容。

现在让我们深入探讨这个问题。

首先,旧的zip运算符(可以在这里找到:old zip)现在已被弃用,而新的zip(可以在这里找到:zip

主要区别在于,旧的操作员是可链接的运算符,其使用方式如下(此后变为可管道操作的::

of(1).pipe( zip(of(2)),map(([a,b]) => ({a,b}))).subscribe(x => console.log(x) // {a:1, b:2})

尽管新操作员是一个创造运算符,其用法如下:

zip(of(1),of(2)).pipe(delay(1000),map(([a,b]) => ({a,b}))).subscribe(x => console.log(x) // {a:1, b:2})

现在,关于这个问题,您可以在zip操作符中传递的可观察对象数量没有限制,例如下面的代码片段将起作用。>

let arr = (new Array(100)).fill(false).map((x,i)=> of({[`key${i}`]:i})) zip(...arr).pipe( mergeAll(), reduce((acc,val) => Object.assign({},acc,val)), )

但是,如果您使用打字稿,并且传递了超过6种不同类型的可观察对象,则将丢失打字和自动完成功能。
© www.soinside.com 2019 - 2024. All rights reserved.