2016-10-23 4 views
1

У меня есть два наблюдаемых, один из ключевых событий пресса, а другой - из запросов 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$ наблюдаемый начать, когда input$ наблюдаемые испускает свое первое значение. Я пробовал использовать skipUntil или debounce минус input$ Наблюдается, но ... не повезло. Я вижу, что запрос ajax происходит на вкладке сети, прежде чем я начну вводить что-либо. Любая идея, как я могу достичь того, чего хочу?

ответ

2

switchMap. Это переключит из потока источника в новом поток, когда источник излучает Наблюдаемый

var url = 'https://restcountries.eu/rest/v1/all'; 

var countries$ = input$.switchMap(input => $.get(url)) 
         .retryWhen(... 

Обратите внимание, что если новый вход поступает до запроса HTTP завершен, старый запрос будет отменен, и новой выданным. Таким образом, switchMap идеально подходит, если запрос http зависит от конкретного ввода (как в поисковом запросе)

Я использовал статический URL-адрес, потому что это то, что использует ваш ОП, но вы можете легко изменить URL-адрес, чтобы включить построенный параметр запроса от входа.

Если вы хотите запустить запрос HTTP только один раз, независимо от того, что вход был, и не хотите, чтобы отменить старый запрос, когда новый вход поступает, используйте take читать только из источника один раз:

var countries$ = input$.take(1).switchMap(input => $.get(url)) 
         .retryWhen(... 
+0

Отлично! Большое спасибо. –

Смежные вопросы