可观察.zip如果源作为数组给出,则不调用 subscribe.next



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

    Observable.zip(universe.map(row => Observable.zip(row)))
        .takeUntil(stopper)
        .subscribe(u =>
            console.log(`[nt[${u.map(r => r.toString()).join("],nt[")}]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>>显示可能的参数类型。

那么还有其他方法可以获得此功能吗?重新分配所有值后,如何在不知道实际尺寸的情况下写下数组值?

重要的是zip()运算符不会采用可观察量数组,而是采用一系列解压缩的可观察量。

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

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

当我们不知道universe是什么时,不可能帮助你。从你现在的情况来看,你似乎可以使用解构赋值(假设你使用的是 ES6 或 TypeScript(:

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

我不知道zipAll()有什么计划,但现在它只是打电话给zip().

截至 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.apply(null, observable_array) Observable.zip(),然后问题就解决了。但是.zip()应该接受(至少一个(Observable数组,以帮助可读性并遵守上述函数声明。

最新更新