javascript - 如何解析多个 Observable

标签 javascript typescript rxjs rxjs5

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

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

人为的例子:

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 中检查它们的类型以确定哪个是哪个

我已经尝试了 combinecombineLatest 描述 here - 但随后它们同时解决,如果 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"]

关于javascript - 如何解析多个 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813747/

相关文章:

angular - 未找到模块 : Error: Package path ./index 未从包 node_modules/rxjs 中导出(请参阅/node_modules/rxjs/package.json 中的导出字段)

javascript - 语法错误 : Unexpected token '?'

javascript - 使用附加时删除引号或包含引号

angular - 以 Angular 向父类注入(inject)依赖服务

javascript - 使用 JSDoc 在 ES6 类上设置索引签名

angular - Angular 是否需要 RxJS?

typescript - 如何使用 LatestFrom 从 rxjs 6 键入数组映射参数

javascript - 控制链接是否可点击

Django 应用程序中的 Javascript 饼图 - 显示动态数据的问题

javascript - 展开时控制台日志中的输出不匹配