如果源为数组

时间:2017-02-06 11:13:16

标签: rxjs rxjs5

我有一个BehaviorSubject<number>s的二维数组。出于调试目的,我想在所有阵列单元发出值后立即以格式化方式写入值。所以我写了这个:

    Observable.zip(universe.map(row => Observable.zip(row)))
        .takeUntil(stopper)
        .subscribe(u =>
            console.log(`[\n\t[${u.map(r => r.toString()).join("],\n\t[")}]\n]`))

没有写任何东西。而且这还没有工作:

    Observable.zip(universe[0])
        .takeUntil(stopper)
        .subscribe(u => console.log(`1[${u.toString()}]`))

但是这些后续工作(数组有5列):

    Observable.zip(universe[0][0], universe[0][1], universe[0][2], universe[0][3], universe[0][4])
        .takeUntil(stopper)
        .subscribe(u => console.log(`2[${u.toString()}]`))

    Observable.zip(Observable.zip(Observable.zip(Observable.zip(universe[0][0], universe[0][1]), universe[0][2]), universe[0][3]), universe[0][4])
        .takeUntil(stopper)
        .subscribe(u => console.log(`3[${u.toString()}]`))

我也考虑过.zipAll()运算符,但没有关于它的文档。

这可能是Observable.zip()代码中的一个错误,因为它在代码帮助中将ArrayLike<BehaviorSubject<number>>显示为可能的参数类型。

有没有其他方法可以获得此功能?一旦重新分配了所有值,如何在不知道实际尺寸的情况下将数组值写下来?

2 个答案:

答案 0 :(得分:5)

重要的是zip()运算符不接受Observables数组,而是取一组解压缩的Observables。

这就是Observable.zip([obs1, obs2, obs3])不起作用的原因。

Observable.zip(obs1, obs2, obs3)有效。

当我们不知道universe是什么时,我们无法帮助您。从你现在的情况来看,似乎你可以使用destructuring assignment(假设你正在使用ES6或TypeScript):

Observable.zip(...universe[0]);

我不知道zipAll()有什么计划,但现在它只是调用zip()

答案 1 :(得分:1)

自rxjs@5.0.3起,Observable.zip()函数实现无法识别Observable数组,即使export declare function zipStatic<T>(array: ObservableInput<T>[]): Observable<T[]>;export declare function zipStatic<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;函数声明发生在rxjs / operator.zip中。 d.ts(这个声明之间的区别是我的Type / Javascript知识之外的区别)。它只是将传递给它的参数对象成员泵送到本地数组,如果传递数组,则永远不会展平它们。甚至不检查参数类型以提高情况。

在收到@ martin上面的答案后,我将Observable.zip()的调用更改为Observable.zip.apply(null, observable_array),然后问题就解决了。但.zip()应接受(至少一个)Observable个数组,以帮助提高可读性并遵守上述函数声明。