【问题标题】:emit an object as the value of an observable timer发出一个对象作为可观察计时器的值
【发布时间】:2016-06-18 05:48:00
【问题描述】:

我需要重播存储在数据库中的一系列事件。所以我想创建一个 Observable 计时器流,当每个事件必须发出时,该计时器就会消失。我的问题是我找不到合适的方法来将对象作为计时器的值发出。

让我设置一个简化的(并且有些人为的)示例,但这可以解释问题。

让我们从一个简单的延迟值数组开始

var delays = [200,100,1000,1200,300,1100];

及其对应的 Observable 计时器

var source= Rx.Observable
  .for(delays, t => Rx.Observable.timer(t) );

我可以观察到的

source.subscribe( x => console.log(x) );

到目前为止一切顺利,在每次计时器完成时仅获得一个零列表。

然后,出于本示例的目的,我想获取在表示的延迟时触发的事件,而不是按原始顺序;我想获取每个计时器数组的原始值和索引。

所以,我在 observable 中添加了一个简单的地图

var source= Rx.Observable
  .for(delays, t => Rx.Observable.timer(t) )
  .map((x,i)=>{i,x}); 

并且,为了检查时间是否准确,我在观察者中添加了一个手表,

  var startTime = Date.now();    
  source.subscribe( x => console.log((Date.now()-startTime), x) );

这是我想要得到的

142 { i:1, x:100 }
204 { i: 0, x: 200 }
303 { i: 4, x: 300 }
1002 { i: 2, x: 1000 }
1101 { i: 5, x: 1100 }
1203 { i: 3, x: 1200 }

我没有得到数组中的原始索引,而是它们被发出的顺序。

这是我得到的,而不是

1046 { x: 0, i: 0 }
1166 { x: 0, i: 1 }
1371 { x: 0, i: 2 }
2472 { x: 0, i: 3 }
3673 { x: 0, i: 4 }
3974 { x: 0, i: 5 }

让一个对象作为计时器的值发出的最 RxJS 风格的技术是什么?

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    您可以只 flatMap 将计时器添加到数组中的可观察对象,并 map 将时间和索引指向计时器。

    const o = Rx.Observable;
    const delays = [200,100,1000,1200,300,1100];
    const delays$ = o.from(delays)
      .flatMap( (t, i) => o.timer(t).map({t,i}));
    
    delays$.subscribe(x => console.log(x));
    

    会发射

    [object Object] {
      i: 1,
      t: 100
    }
    [object Object] {
      i: 0,
      t: 200
    }
    [object Object] {
      i: 4,
      t: 300
    }
    [object Object] {
      i: 2,
      t: 1000
    }
    [object Object] {
      i: 5,
      t: 1100
    }
    [object Object] {
      i: 3,
      t: 1200
    }
    

    jsbin example

    【讨论】:

    • 我看到的问题是你没有得到原始索引,而是发出索引。所以你并没有真正恢复原始对象,而只是延迟时间。我正在编辑我的问题,以便更清楚地了解目标。
    • 此外,事件不是按照所需的计时器到期顺序发出的,而是按照它们排队的顺序发出的。
    • 忘记我的最后评论,我刚刚发现原始方法没有按照我想要的顺序触发事件。我将不得不重新考虑我的完整策略。
    • “我看到的问题是你没有得到原始索引”它们是相同的/原始索引,但我明白你在做什么。您希望它们按时间顺序发射。更新我的答案。
    • 是的!就是这样!谢谢,我永远也想不通.for().from().flatMap() 之间的细微差别
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2019-04-23
    • 2020-03-05
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多