【问题标题】:How to resolve multiple Observables如何解析多个 Observables
【发布时间】:2017-06-08 09:35:18
【问题描述】:

我有 2 个(或更多)从服务返回的 Observable,每个只返回一个值(想想Observable.just())。它们中的每一个都是不同的类型(我用 TypeScript 编写,所以类型很重要)。

有没有办法知道所有 Observable 何时解决(使用 Promise 术语)成功或失败,我需要能够单独处理失败并继续。

人为的例子:

const obs1  = someService.getThisThing(); //Observable<Type1>
const obs2  = someService.getAnotherThing(); //Observable<Type2>

const someObj = {};

obs1.subscribe(v1 => someObj.v1 = v1);
obs2.subscribe(v2 => someObj.v2 = v2);

// call someFunc(someObj), only when both above observables resolved to a value
someFunc(someObj);

我曾尝试使用 merge,但随后我失去了类型安全性,因为值可能以任何顺序出现,我必须检查它们在 .subscribe 中的类型以确定哪个是哪个

我已经按照here 的描述尝试了combinecombineLatest - 但是它们同时解决了,如果 1 失败 - 一切都失败了

【问题讨论】:

    标签: javascript typescript rxjs rxjs5


    【解决方案1】:

    如果您需要能够单独处理每个错误,那么您必须将catch()(或者可能是其他一些运算符)附加到每个 Observable。 forkJoin()merge() 等运算符总是在其任何来源发送错误时发送错误通知。

    const Observable = Rx.Observable;
    
    let sources = [
      Observable.of(123).catch((err) => Observable.of('caught error')),
      Observable.throw('error').catch((err) => Observable.of('caught error'))
    ];
    
    Observable.forkJoin(...sources)
      .subscribe(values => console.log(values));
    

    观看现场演示:https://jsbin.com/hirodef/3/edit?js,console

    第二个 Observable 抛出一个错误,该错误被 catch() 捕获并替换为 caught error 字符串。

    这个演示打印到控制台:

    [123, "caught error"]
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 2023-04-05
      • 2020-04-19
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多