Rxjs 在本例中,为什么在CombineTest和merge之后会再次触发初始流?
请看下面的摘录: 让requestStream=Rx.Observable .of`${GITHUB\u API}?自=${randomNumber}` .mergeMapurl=>{ console.log`正在执行对:${url}的请求` 返回Rx.Observable.fromjQuery.getJSONurl }; 让refreshStream=Rx.Observable.fromEventrefreshButton'单击' .单击“开始” .do \=>users.empty .CombineRelatesRequestStream,_,users=>users.slicerandomNumberusers.length; 让randomUserStream=userRemovedStream .CombineRelatesRequestStream,_,users=>users[randomNumberusers.length]; 请求流 .合并刷新流 .flatMapusers=>users .mergerandomUserStream .filter\u=>users.children.lengthRxjs 在本例中,为什么在CombineTest和merge之后会再次触发初始流?,rxjs,rxjs5,Rxjs,Rxjs5,请看下面的摘录: 让requestStream=Rx.Observable .of`${GITHUB\u API}?自=${randomNumber}` .mergeMapurl=>{ console.log`正在执行对:${url}的请求` 返回Rx.Observable.fromjQuery.getJSONurl }; 让refreshStream=Rx.Observable.fromEventrefreshButton'单击' .单击“开始” .do \=>users.empty .Com
有人能帮我理解为什么会发生这种情况,以及如何处理这种情况吗因此,我可以从API在第一次调用期间已返回的用户中提取最大值?之所以会这样,是因为您实际上有三个对requestStream的订阅。然而,您对这三者如何交互的直觉是正确的,因为您的requestStream Observable是冷的,所以每次有订阅时,它都会创建一个新的流 这不一定很明显,因为只显式创建了一个订阅,但每次您将requestStream传递给CombineTest时,它都会创建一个新的订阅,而这个订阅又会启动一个新的流,在本例中,它会调用您的底层API 如果您不希望发生这种情况,我建议您使用publishLast这样的多播运营商 因此,requestStream将成为:
let requestStream = Rx.Observable
.of(`${GITHUB_API}?since=${randomNumber()}`)
.mergeMap(url => {
console.log(`performing request to: ${url}`)
return Rx.Observable.from(jQuery.getJSON(url))
})
.publishLast();
在本例中,requestStream现在实际上是一个可连接的可观察对象,因此您还需要在某个点启动它,通常您会等到所有订阅者都连接好
/* Rest of you example */
.map(event => event.target.parentNode)
.subscribe(user => {
user.remove();
userRemovedStream.next('');
});
requestStream.connect();
这是一个很好的解释,非常感谢!我将更深入地研究冷热观测和多播。到目前为止,它工作得很好!