我有一个场景
如果重要,我正在使用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);
});
答案 0 :(得分:3)
如果this.doSomething(api1ResData, api2ResData)
是异步函数,返回Observable或Promise,并且您希望在下一个操作中使用该操作的结果,则可以使用switchMap
或mergeMap
输出结果进入另一个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。