我在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();
        }
    });
}))


然后在您的subscribe中:

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

10-05 20:43