我有两个observable,一个来自关键新闻事件,另一个来自ajax请求。 我希望第二个流在第一个流发出第一个值时启动。
var input$ = Rx.Observable.fromEvent( input, 'keydown')
.debounceTime(500)
var countries$ = Rx.Observable.of('https://restcountries.eu/rest/v1/all')
.flatMap(url => $.get( url ))
.retryWhen( errors => {
return errors.scan( (sum, err) => {
if( sum === 2 )
{
throw err;
}
else{
return sum + 1;
}
}, 0).delay(1000)
})
我正在使用rxjs 5,我想在countries$
observable发出第一个值时启动input$
observable。我尝试使用skipUntil
或debounce
传递input$
Observable,但是......没有运气。在我开始输入任何内容之前,我在网络选项卡中看到了ajax请求。 知道如何实现我的目标吗?
答案 0 :(得分:3)
使用switchMap
。每当源Observable发出
var url = 'https://restcountries.eu/rest/v1/all';
var countries$ = input$.switchMap(input => $.get(url))
.retryWhen(...
请注意,如果在http请求完成之前到达新输入,则旧请求将被取消并发出新请求。因此,如果发出的http请求取决于特定的输入(如在搜索查询中),switchMap
是完美的
我使用的是静态网址,因为这是您的操作系统使用的网址,但您可以轻松更改网址,以包含根据输入构建的查询参数。
如果您希望一次运行http请求而不管输入是什么,并且在新输入到达时不想取消旧请求,请使用take
仅从源读取一次:< / p>
var countries$ = input$.take(1).switchMap(input => $.get(url))
.retryWhen(...