当另一个Observable发出其第一个值时启动流

时间:2016-10-23 13:45:58

标签: ajax rxjs observable

我有两个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。我尝试使用skipUntildebounce传递input$ Observable,但是......没有运气。在我开始输入任何内容之前,我在网络选项卡中看到了ajax请求。 知道如何实现我的目标吗?

1 个答案:

答案 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(...