Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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
Rxjs 在本例中,为什么在CombineTest和merge之后会再次触发初始流?_Rxjs_Rxjs5 - Fatal编程技术网

Rxjs 在本例中,为什么在CombineTest和merge之后会再次触发初始流?

Rxjs 在本例中,为什么在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

请看下面的摘录:

让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.lengthusers.appendcreateItemuser .mergeMapuser=>Rx.Observable.fromEvent$`close-${user.login}`,单击 .mapevent=>event.target.parentNode .subscribeuser=>{ user.remove; userRemovedStream.next; }; requestStream返回一个包含100个用户的数组,但是,我当时只使用了其中的三个MAX_建议。refreshStream和randomUserStream的存在是为了重用requestStream中的其他97个用户。问题是,当我运行上面的代码时,我仍然看到在控制台上执行请求:。。。三次

我注意到这是在最后一个流中添加合并方法之后发生的,但是,我不确定为什么会发生这种行为

我的理解是:当我合并refreshStream和randomUserStream时,每当发出一个新项,前者单击refresh按钮,后者单击remove按钮,requestStream上先前发出的数组将被解析并向前传递,而不是单击本身。这不应重新触发requestStream


有人能帮我理解为什么会发生这种情况,以及如何处理这种情况吗因此,我可以从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();

这是一个很好的解释,非常感谢!我将更深入地研究冷热观测和多播。到目前为止,它工作得很好!