我正在尝试从可观察变量的压缩数组本身中获取结果,而这些可观察变量本身就是简单可观察变量数组的拉链。如下:
a(x) {
const observables = [of(x), of(x+1)];
return zip(observables);
}
b() {
const observables = [a(1), a(2)];
return zip(observables);
}
其余的代码被断言可以正常工作。实际上,当内部a()函数返回单个可观察对象(当然,是对象数组,以反映可观察对象的zip)时,外部zip可以正常工作。但是,使用内部zip时,永远不会调用内部zip中的代码。
我在这里做什么错了?
答案 0 :(得分:2)
这个问题我花了几个小时。
尝试:
zip(...observables);
必须扩展参数,否则您的数组将被视为ObservableInput
,这可能不是您期望的行为。
您可以将此功能作为您的用例的安全后备:
export function zipArray<T>(array: ObservableInput<T>[]): Observable<T[]> {
return array.length ? zip(...array) : of([]);
}
并这样称呼它:
zipArray(observables)
答案 1 :(得分:1)
出了什么问题:zip([Obs1, Obs2])
与zip(Obs1, Obs2)
不同。
但是有一个技巧可以进行转换:...argsArray[]
使数组的行为就像是一堆参数(例如python中的*args
)。
此外,如果您发现自己在迭代器中重复使用of
运算符,那么也许应该考虑使用from
运算符。
function a(x) {
const observables = from([x, x+1]);
return zip(observables);
}
function b() {
const observables = [a(1), a(2)];
return zip(...observables);
}
测试:
b().subscribe(val =>console.log(val))
[[1],[2]]
[[2],[3]]
通常使用[1]而不是1,因为zip的输出返回包含值的数组。