Angular 2 http - 组合多个Observable

时间:2016-09-10 19:31:05

标签: angular rxjs observable

我在async Observable世界中完全是新的。我希望有人帮助我。

我有两个Observable<boolean>,我希望将它们合并。

我试图使用:

var obs1 = Observable.of(true).delay(1000);
var obs2 = Observable.of(false).delay(100);    
obs1.combineLatest(obs2, (obs1Val, obs2Val) => {
    //bool result
    });

那几乎就是...... 几乎是因为我想在obs1完成时启动obs2,所以combineLatest同时启动。

obs1和obs2这里是我的案例中的简单示例,即有角度的http请求:

obs1 : Observable<boolean> = http.get(...).map(d => <boolean>d);

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

如果你想在从obs1得到回应时启动obs2,那么必须在obs1.subscribe的onNext中调用它。

getBothResult() {
  return Rx.Observable.create(function (observer) {
    obs1 : Observable<boolean> = http.get(...).map(d => <boolean>d);
    obs1.subscribe((obs1Value) {
      Observable.of(false).delay(100).subscribe(obs2Value => {
        //compute value from obs1Value and obs2Value as they are visible in closure assign it to eg. finalValue
        var finalValue = obs1Value + obs2Value;
        observer.onNext(finalValue);
      });  
    });
  });
}    

很可能存在一个以某种方式完成所有这些事情的运算符,但是我不知道它。

答案 1 :(得分:1)

您可以使用observable zip

 let obs1 = Observable.of(true).delay(1000);
 let obs2 = Observable.of(false).delay(100);    

 let source = Observable.zip(
      obs1,
      obs2,
      (ob1, ob2) => {
        return {
          value1: ob1,
          value2: ob2
        };
      }
  );
  source.subscribe(data => console.log(data))

答案 2 :(得分:0)

由于你想在obs1之后执行obs2,我们可以等待回应 在Rx世界中,你应该避免订阅一个observable,然后在回调中订阅另一个observable。

这是一种可以为您提供所需结果的方法。

var obs1 = Observable.of(true).delay(1000);
var obs2 = Observable.of(false).delay(100);
var obsOf1And2 = obs1.flatMap(obs1Response => 
    obs1Response.flatMap(obs2Response => { 
        // do what you want with both responses 
    }));

obsOf1And2.subscribe(console.log);