【问题标题】:RXJS zip of zip (arrays) observable is not firing可观察的 zip(数组)的 RXJS zip 未触发
【发布时间】:2018-11-03 21:24:49
【问题描述】:

我试图从一组压缩的 observables 中获取结果,它们本身是一组简单的 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(array)zip(arg1, arg2,...)不一样。

标签: rxjs observable angular2-observables


【解决方案1】:

我在这个问题上花了多少时间..

试试:

zip(...observables);

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

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

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

然后这样称呼它:

zipArray(observables)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2023-04-09
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多