javascript - RXjs - 即使发生错误也继续收听

标签 javascript rxjs observable

我有两个(多个)异步函数包装在一个 Observable 中,我想一起运行它们并检查是否有错误或已完成。这是我所做的:

var observables = [];

observables.push(new Observable((observer:any) => {
    async1(options, (error, info) => {
        if (error) {
            observer.error(error);
        } else {
            observer.next(info);
            observer.complete();
        }
    });
}))

observables.push(new Observable((observer:any) => {
    async2(options, (error, info) => {
        if (error) {
            observer.error(error);
        } else {
            observer.next(info);
            observer.complete();
        }
    });
}))

Observable.forkJoin(observables).subscribe(
    data => {
        console.log(data);
    },
    error => {
        console.log(error);
    }
)

我的问题来了...当两个异步函数都成功完成时,它会调用 data =>{} 并在一个数组中返回两个结果。

如果这两个函数之一失败,它将调用一次 error =>{},仅此而已。我想听每一个错误,我该怎么做?

最佳答案

合并多个流的运算符的默认行为是在其中一个流发出错误通知后立即退出。之所以如此,是因为根据 Rx 语法,错误是最终的,因此通常假设运算符返回的流必须立即失败。

这里一个简单的解决方案是取消 error 通知,并将其替换为插入到 next 通知中的错误数据结构。

所以像这样:

observables.push(new Observable((observer:any) => {
    async1(options, (error, info) => {
        if (error) {
            observer.next({error});
        } else {
            observer.next({info});
            observer.complete();
        }
    });
}))

然后在您的订阅中:

Observable.forkJoin(observables).subscribe(
    arrayData => arrayData.forEach(data => data.info? {
        console.log(data.info);
    } : {
        console.log(data.error);
    })
)

关于javascript - RXjs - 即使发生错误也继续收听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43497696/

相关文章:

Angular rxjs : keep subscription after error reached

javascript - AngularFire 不会触发更改检测

javascript - 如何关闭实现多选

javascript - JavaScript 函数的目标数组

angular - 完成所有多个服务调用后执行代码

angular - 在继续之前如何等待 for 循环内的订阅完成

r - 具有动态文本的 ShinyApp 出现在多个 UI 元素的任何更改上

angular - 链接并合并 3 个具有结果依赖性的 RxJS Observables,而无需嵌套在 TypeScript 和 Angular 4 中

javascript - div 位置 + 运算符无法按预期工作

javascript - 导航栏 - 选项卡定位