Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Rx.js中,如何区分哪个流触发CombineTest方法?_Javascript_Rxjs_Reactive Programming_Rxjs5 - Fatal编程技术网

Javascript 在Rx.js中,如何区分哪个流触发CombineTest方法?

Javascript 在Rx.js中,如何区分哪个流触发CombineTest方法?,javascript,rxjs,reactive-programming,rxjs5,Javascript,Rxjs,Reactive Programming,Rxjs5,我正在写我自己版本的。点击refresh按钮将获取建议列表并刷新,closeButton将恢复建议列表中的数据并刷新 我想让closeClick$和suggestions$组合在一起,以驱动订阅者。 演示代码如下: var refreshClick$ = Rx.Observable .fromEvent(document.querySelector('.refresh'), 'click') var closeClick$ = Rx.Observable.merge( Rx.Obser

我正在写我自己版本的。点击refresh按钮将获取建议列表并刷新,closeButton将恢复建议列表中的数据并刷新

我想让closeClick$和suggestions$组合在一起,以驱动订阅者。 演示代码如下:

var refreshClick$ = Rx.Observable
  .fromEvent(document.querySelector('.refresh'), 'click')

var closeClick$ = Rx.Observable.merge(
  Rx.Observable.fromEvent(document.querySelector('.close1'), 'click').mapTo(1),
  Rx.Observable.fromEvent(document.querySelector('.close2'), 'click').mapTo(2),
  Rx.Observable.fromEvent(document.querySelector('.close3'), 'click').mapTo(3)
)

var suggestions$ = refreshClick$
  .debounceTime(250)
  .map(() => `https://api.github.com/users?since=${Math.floor(Math.random()*500)}`)
  .startWith('https://api.github.com/users')
  .switchMap(requestUrl => Rx.Observable.fromPromise($.getJSON(requestUrl)))

Rx.Observable.combineLatest(closeClick$, suggestions$, (closeTarget, suggestions) => {
  if (/* the latest stream is closeClick$ */) {
    return [{
      target: clickTarget,
      suggestion: suggestions[Math.floor(Math.random() * suggestions.length)]
    }]
  }
  if (/* the latest stream is suggestions$ */) {
    return [1, 2, 3].map(clickTarget => ({
      target: clickTarget,
      suggestion: suggestions[Math.floor(Math.random() * suggestions.length)]
    }))
  }
})

Rx.Observable.merge(renderDataCollectionFromSuggestions$, renderDataCollectionFromCloseClick$)
  .subscribe(renderDataCollection => {
    renderDataCollection.forEach(renderData => {
      var suggestionEl = document.querySelector('.suggestion' + renderData.target)
      if (renderData.suggestion === null) {
        suggestionEl.style.visibility = 'hidden'
      } else {
        suggestionEl.style.visibility = 'visible'
        var usernameEl = suggestionEl.querySelector('.username')
        usernameEl.href = renderData.suggestion.html_url
        usernameEl.textContent = renderData.suggestion.login
        var imgEl = suggestionEl.querySelector('img')
        imgEl.src = "";
        imgEl.src = renderData.suggestion.avatar_url
      }
    })
  })
你可以在一本书中找到它

您应该注意条件判断中的注释,关闭单击$emits[{target:x,suggestion:randomssuggestionx}],建议$emits[{target:1,suggestion:randomssuggestion1},{target:2,suggestion:randomssuggestion2},{target:3,suggestion:randomssuggestion3}]。subscriber根据发出的数据呈现接口


是否有一些方法/技巧可以区分组合中最新的流或优雅的修改?

我认为最简单的方法是使用操作符并始终在数组中保持以前的状态:

Observable.combineLatest(obs1$, obs2$, obs3$)
  .scan((acc, results) => {
    if (acc.length === 2) {
      acc.shift();
    }
    acc.push(results);
    return acc;
  }, [])
  .do(states => {
    // states[0] - previous state
    // states[1] - current state
    // here you can compare the two states to see what has triggered the change
  })
当然,你可以使用你想要的任何操作符来代替do

或者,您可以使用bufferCount2,1来代替扫描操作符,它应该发出相同的两个数组。。。我没有测试它

我制作了一个工作版本,我必须重新使用热刷新Click$。我问这个问题是为了得到简短而优雅的答案。如果我能分辨出最新的流,也许是最快的方式!