RxJS5 - 等待 2 个 http 调用,然后监听套接字

RxJS5 - wait for 2 http calls, then listen to socket

我有一个场景

  1. 我需要调用 2 个 http 服务等待它们
  2. 调用一些方法
  3. 开始监听下一个将经常监听的套接字
  4. 每次套接字流,调用一些其他方法

如果重要的话,我正在使用 Angular2。

我现在拥有的是独立的(并且可以工作)。

我想知道如何在所有一系列运算符中创建它以保证在不使用本地变量的情况下等待前 2 个调用? - 如果这甚至有意义...

我在做什么:

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);
    });

如果this.doSomething(api1ResData, api2ResData)是一个返回Observable或Promise的异步函数,而你想在下一个操作中使用该操作的结果,你可以使用switchMapmergeMap来将结果输出到另一个 observable 中,然后订阅它来做 socket 操作,比如:

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);
});

如果 this.doSomething(api1ResData, api2ResData) returns 另一个类型是同步的或者是无效的,那么你可以只使用 .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