无法触发zip(数组)的RXJS zip,无法触发

时间:2018-11-03 21:24:50

标签: rxjs observable angular2-observables

我正在尝试从可观察变量的压缩数组本身中获取结果,而这些可观察变量本身就是简单可观察变量数组的拉链。如下:

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中的代码。

我在这里做什么错了?

2 个答案:

答案 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的输出返回包含值的数组。