如果源以数组形式给出,Observable.zip 不会调用 subscribe.next
Observable.zip does not call subscribe.next if sources are given as array
我有一个 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>>
作为可能的参数类型。
那么有没有其他方法可以获得此功能?在不知道实际尺寸的情况下,如何在重新分配所有值后记下数组值?
重要的是 zip()
运算符不接受 Observables 数组,而是一系列未打包的 Observables。
这就是 Observable.zip([obs1, obs2, obs3])
不起作用的原因。
但是 Observable.zip(obs1, obs2, obs3)
有效。
当我们不知道 universe
是什么时,无法为您提供帮助。从你现在所拥有的看来,你可以使用 destructuring assignment (假设你使用的是 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()
的调用更改为Observable.zip.apply(null, observable_array)
,然后问题就解决了。但是 .zip()
应该接受(至少一个)Observable
数组以帮助提高可读性并遵守上述函数声明。
我有一个 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>>
作为可能的参数类型。
那么有没有其他方法可以获得此功能?在不知道实际尺寸的情况下,如何在重新分配所有值后记下数组值?
重要的是 zip()
运算符不接受 Observables 数组,而是一系列未打包的 Observables。
这就是 Observable.zip([obs1, obs2, obs3])
不起作用的原因。
但是 Observable.zip(obs1, obs2, obs3)
有效。
当我们不知道 universe
是什么时,无法为您提供帮助。从你现在所拥有的看来,你可以使用 destructuring assignment (假设你使用的是 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()
的调用更改为Observable.zip.apply(null, observable_array)
,然后问题就解决了。但是 .zip()
应该接受(至少一个)Observable
数组以帮助提高可读性并遵守上述函数声明。