可观察到的 zip(数组)的 RXJS zip 未触发

RXJS zip of zip (arrays) observable is not firing

我正在尝试从一个压缩的可观察对象数组中获取结果,它们本身就是简单可观察对象数组的压缩。如下:

a(x) {
    const observables = [of(x), of(x+1)];
    return zip(observables);
}

b() {
    const observables = [a(1), a(2)];
    return zip(observables);
}

断言其余代码可以正常工作。实际上,当内部 a() 函数 returns 单个可观察对象(当然是对象数组,以反映可观察对象的 zip)时,外部 zip 工作正常。然而,当使用内部 zip 时,永远不会调用内部 zip 中的代码。

我做错了什么?

我花了多少时间解决这个问题..

尝试:

zip(...observables);

必须展开参数,否则您的数组将被视为 ObservableInput,这可能不是所需的行为。

您可以将此函数作为您的用例的安全后备:

export function zipArray<T>(array: ObservableInput<T>[]): Observable<T[]> {
    return array.length ? zip(...array) : of([]);
}

并这样称呼它:

zipArray(observables)

有什么问题: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 returns 的输出是一个包含值的数组。