订阅方法不是用RxJS触发的

时间:2016-07-01 09:49:23

标签: javascript rxjs

我是RxJS的初学者, 我目前正在使用RxJS @ 5并且不了解我的代码的行为

const currentExtentMinutes$ = initialExtentMinutes$
    .merge(selectedExtentMinutes$)
    .distinctUntilChanged()

// We message the worker that
// there is a new extent minutes
currentExtentMinutes$
  .subscribe(currentExtentMinutes => {
      console.log('send current extent', currentExtentMinutes);
      currentExtentMinutes => worker.postMessage({currentExtentMinutes});
  });

这很好用,但是只要我添加另一段代码,第一个订阅就不再有效了

sortedTeams$.withLatestFrom(currentExtentMinutes$)
  .subscribe(([teams, extent]) => {
      const d3line = line()
        .x((pt, i) => scaleMinutes.invert(extent[0]) + scaleMinutes.invert(i))
        .y(scaleRanking)
        .curve(curveCardinal.tension(.5));
      const lines = gGraph.selectAll('.team-path').data(teams, _.get('name'));
      lines.enter().append('path')
        .attr('class', 'team-path')
        .style('stroke', team => `rgb(${team.colors[0]})`)
        .style('stroke-width', 7)
        .style('stroke-linecap', 'round')
        .style('stroke-linejoin', 'round')
        .style('fill', 'none')
        .merge(lines)
        .transition(t)
        .attr('d', team => d3line(team.ranking));
  });

我做错了吗?

1 个答案:

答案 0 :(得分:1)

我认为你可能是可观察者的热与冷性质的另一个受害者。基本上currentExtentMinutes订阅两次,一次在第一个代码段中,第二次使用withLatestFrom。对cold observable的每次订阅都将重新启动生产者,重新生成值(更多细节看看here)。

如果这是问题所在,那么用

分享你的冷观察就足够了
const currentExtentMinutes$ = initialExtentMinutes$
    .merge(selectedExtentMinutes$)
    .distinctUntilChanged()
    .share()