RXjs - 即使出错也继续听

时间:2017-04-19 13:50:01

标签: 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 =>{},就是这样。我想听每一个错误,我该怎么做?

1 个答案:

答案 0 :(得分:2)

组合多个流的运算符的默认行为是在其中一个流发出错误通知后立即退出。这是因为,根据Rx语法,错误是最终的,因此通常假设操作员返回的流必须急切地失败。

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

类似于:

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

然后在subscribe

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