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

时间:2017-08-04 18:04:56

标签: javascript angular rxjs

我现在对造成这个错误的原因感到困惑。我试图压缩7 Observables的结果,如:

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));

但是我收到了这个错误:“类型'{}'”

上不存在“属性'减少'

增加混乱:

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

如果observable都返回原语,那么它可以正常工作。

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

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

它工作正常。

这是RxJS中的错误吗?我错过了关于zip实现的一些内容吗?这是一个角度编译器吗?没有多少搜索文档显示了对zip参数数量的限制。任何见解都表示赞赏。

由于

编辑:任何其他发现此事的人。

最好的解决方法是将observables放在一个数组中并将其作为单个参数提供,如:

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})]);

也可以。编辑:数组提要停止工作,现在需要使用传播运算符和数组。

1 个答案:

答案 0 :(得分:0)

自2017年以来,很多事情发生了变化,rxjs文档非常好,涵盖了人们可能想要的几乎所有内容。

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

首先要反对的是旧的zip运算符(可以在这里找到:old zip),现在不推荐使用新的zip(可以在这里找到:{{3 }})

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

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种不同类型的可观察对象,则会丢失打字和自动补全功能。