【问题标题】:Observable.interval() + flatMap() weird behaviorObservable.interval() + flatMap() 奇怪的行为
【发布时间】:2016-09-08 10:27:26
【问题描述】:

我试图将Observable.interval().flatMap() 联系起来,但我得到了(我认为是)一个意想不到的行为。

这是我正在使用的代码(使用 Angular 2):

Observable.interval(1500)
  .scan( (numArr:any[],curr:any,i:number) => {
    numArr.push(i);
    return numArr;
  }, [])
  .do(arr => console.log('interval value', arr))
  .flatMap(numArr => {
    return Observable.interval(500)
      .map(i => {
        numArr.forEach((el, i, arr) => {
          arr[i] += 1;
        })
        return numArr;
      })
  }).subscribe(res => console.log('final value', res));

我得到的结果是

interval value [0]
final value [1]
final value [2]
interval value [2, 1]
final value [3, 2]
final value [4, 3]
final value [5, 4]
final value [6, 5]
final value [7, 6]
interval value [7, 6, 2]
final value [8, 7, 3]
final value [9, 8, 4]
final value [10, 9, 5]
....

我希望在每个“间隔值” 周期之间接收 3 个值,而不是每次间隔发出一个值时我都会得到一个更大的列表...为什么会发生这种情况,我该如何避免这种情况行为?

我想要实现的是将第一个 Observable.interval() 每 500 毫秒发出的数组的每个值增加 1。 换句话说,我期望的是:

interval value [0]
final value [1]
final value [2]
final value [3]
interval value [3, 1]
final value [4, 2]
final value [5, 3]
final value [6, 4]
interval value [6, 4, 1]
final value [7, 5, 2]
final value [8, 6, 3]
final value [9, 7, 4]
....

希望你能帮忙,谢谢。

【问题讨论】:

    标签: angularjs rxjs observable


    【解决方案1】:

    有趣的问题。我不知道我是否完全理解你在这里的目的(当你在 flatMap 中改变原始数组时,还有很多事情要做),但这是我要从这里开始的地方:

    您在 flatMap 中创建的 observable 不会终止 - 即使已经进入另一个区间值,它也会继续递增 numArr 中的值。这意味着在进入 2 个区间值之后,您实际上将 numArr 中的所有值递增两次,每次 500毫秒,在 3 个间隔值三次之后,依此类推。 您想要的(将所有值增加三次,然后向数组添加另一个值,在这种情况下每 500 毫秒,然后重复)可以通过使用 .take(3) 将 flatMap 中的 Observable 限制为三个循环来实现。

    你会通过使用 concatMap 而不是 flatMap 来获得相同的期望行为,因为它会连接(一个 observable 在当时运行,下一个仅在前一个完成时开始)在内部创建的 observables 而不是合并它们(所有 Observables 运行在同时)。并不是说您应该这样做:D,请使用 take(3)。

    【讨论】:

      【解决方案2】:

      第二个flatMap() 应该被转换成switchMap(),所以间隔observables 不会被挂起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2015-07-20
        相关资源
        最近更新 更多