Observable.interval()+ flatMap()奇怪的行为

时间:2016-09-08 10:27:26

标签: angularjs rxjs observable

我正在尝试将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个值,而不是每次间隔发出一个值时我得到一个更大的列表...为什么会发生这种情况?我怎么能避免这种情况行为?

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

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]
....

希望你能提供帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

有趣的问题。我不知道我是否完全理解你在这里想要做什么(当你在flatMap中改变原始阵列的时候还有很多事情发生)但是这就是我所在的地方会离开这里:

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

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

答案 1 :(得分:0)

第二个flatMap()应该转换为switchMap(),因此间隔可观测对象将不会处于待处理状态。