2017-01-27 3 views
3

У меня есть сценарий, гдеRxJS5 - ждать 2 HTTP вызовов, а затем прослушивать сокет

  1. Мне нужно позвонить 2 HTTP службы ждать их обоих
  2. Позвоните некоторый метод
  3. Начало прослушивания сокет, который будет рядом часто
  4. Каждый раз, когда сокет потоки, вызовите некоторый другой метод

Если это имеет значение, я использую Angular2.

У меня сейчас отдельный (и рабочий).

Мне интересно, как я могу создать это во всей одной серии операторов, чтобы гарантировать ожидание первых двух вызовов без использования локальных варов? - если даже имеет смысл делать ...

То, что я работаю с:

this.sub1 = Observable 
    .forkJoin([http.get(/api1), http.get('/api2')]) 
     .subscribe(([api1ResData, api2ResData]) => { 
      this.doSomething(api1ResData, api2ResData); 
     }); 

this.sub2 = socket.get('api3') 
    .subscribe(data => { 
     this.doSomethingElse(api3ResData); 
    }); 

ответ

3

Если this.doSomething(api1ResData, api2ResData) является функцией асинхронного возвращения Наблюдаемого или обещания, и вы хотите использовать результат этой операции в следующий, вы можете использовать switchMap или mergeMap для вывода результата в другой наблюдаемой, то подписаться на него, чтобы сделать операцию сокета, как:

this.sub1 = Observable 
.forkJoin([http.get(/api1), http.get('/api2')]) 
.switchMap(([api1ResData, api2ResData]) => { 
    return this.doSomething(api1ResData, api2ResData) 
}) 
.switchMap(doSomethingResult => { 
    return socket.get('api3') 
}) 
.subscribe(socketGetResult => { 
    this.doSomethingElse(api3ResData); 
}); 

If this.doSomething(api1ResData, api2ResData) возвращает другой тип синхронно или пустота, то вы можете просто к .do оператору (В случае, если вам не нужен doSomething результата), или .map иначе, если вы используете doSomething результат в socket.get(3)

this.sub1 = Observable 
.forkJoin([http.get(/api1), http.get('/api2')]) 
.do(([api1ResData, api2ResData]) => { 
    this.doSomething(api1ResData, api2ResData) 
}) 
.switchMap(([api1res, api2res]) => { 
    return socket.get('api3') 
}) 
.subscribe(socketGetResult => { 
    this.doSomethingElse(api3ResData); 
}); 

Вы до сих пор используете switchMap для socket.get() операции, так как вам нужно сопоставить другой наблюдаемый и получить предыдущий результат forkJoin, поскольку оператор .do должен выполнить код без изменения текущего наблюдаемого.

switchMap official docs

+0

Спасибо за информацию. Пробуя версию async, я получаю ошибку типа: Аргумент типа '([api1ResData, api2ResData]: any []) => void' не присваивается параметру типа '(значение: any [], index: number) = > ObservableInput <{}> '. Тип 'void' не присваивается типу 'ObservableInput <{}>'. – Thibs

+0

Привет, вы можете проверить, были ли вы установлены операторы 'return', и если да, можете ли вы сказать мне, какая из двух коммутационных макетов дает вам ошибку? Кроме того, убедитесь, что и socket.get, и this.doSomething возвращают либо обещание, либо наблюдаемое. Здесь попробуйте указать источник этих функций, чтобы они возвращали любой из этих типов. – Bertofer

+0

Благодарю вас за ваше время. Проблема в том, что this.doSomething не возвращает наблюдаемый, это обычный метод, при котором ничего не возвращается. (Тот же случай для doSomethingElse) – Thibs