RxJS5 - 等待2个http调用,然后听socket

时间:2017-01-27 20:41:46

标签: rxjs5

我有一个场景

  1. 我需要拨打2个http服务等待他们
  2. 调用一些方法
  3. 开始收听下一个经常
  4. 的套接字
  5. 每次套接字流时,调用其他方法
  6. 如果重要,我正在使用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);
        });
    

1 个答案:

答案 0 :(得分:3)

如果this.doSomething(api1ResData, api2ResData)是异步函数,返回Observable或Promise,并且您希望在下一个操作中使用该操作的结果,则可以使用switchMapmergeMap输出结果进入另一个observable,然后订阅它来执行套接字操作,如:

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)同步返回其他类型或无效,那么您可以只使用.do运算符(如果您不需要doSomething结果),或{{1 }}否则,如果您在.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操作,因为您需要映射到另一个observable,并在socket.get()运算符执行时收到之前的forkJoin结果代码而不更改当前的observable。

检查switchMap official docs