Javascript 在Rx.js中,如何区分哪个流触发CombineTest方法?
我正在写我自己版本的。点击refresh按钮将获取建议列表并刷新,closeButton将恢复建议列表中的数据并刷新 我想让closeClick$和suggestions$组合在一起,以驱动订阅者。 演示代码如下: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
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$。我问这个问题是为了得到简短而优雅的答案。如果我能分辨出最新的流,也许是最快的方式!