【问题标题】:Angular 2 http - combine multiple ObservablesAngular 2 http - 组合多个 Observables
【发布时间】:2016-09-10 19:31:05
【问题描述】:

我是异步 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 在我的例子中是简单的例子,那就是 angular http 请求:

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

提前感谢您的帮助

【问题讨论】:

  • 为什么不订阅第一个 obs1 并通过回调进行另一个调用?

标签: angular rxjs observable


【解决方案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);
      });  
    });
  });
}    

很可能存在一个操作员以某种漂亮的方式完成所有这些事情,但我不知道。

【讨论】:

  • 类似那样,但我想将您的代码包装在另一个函数中,该函数返回从 obs1 和 obs2 值计算的 Observable 。我在那里尝试过,但它不起作用:jsfiddle
  • obs2 在 obs1 完成后触发。 getBothResult() 等待两者。最后 getBothResult() 返回由 obs1Val 和 obs2Val 计算得出的 Observable。这就是我需要的。
  • 就是这样!就我而言,我还必须在每个 next() 之后调用observer.complete()。非常感谢!
【解决方案2】:

您可以使用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))

【讨论】:

  • 根据 RxJS 文档,恐怕 obs2 在开始之前不会等待 obs1 完成:/
  • 经过测试。正如我预期的那样,两个可观察对象同时开始:/
  • 嘿,你不要同时开始,你只会同时解决
【解决方案3】:

由于您想让 obs2 在 obs1 之后执行,我们可以等待响应 在 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2019-01-06
    • 1970-01-01
    • 2017-09-09
    • 2020-06-11
    • 2019-07-19
    相关资源
    最近更新 更多