如何避免RxJS管道因首个异常终止,执行全部请求?
RxJS顺序执行AJAX请求时如何忽略错误继续执行后续请求
你的问题出在错误处理的位置——你把catchError放在了concatAll()之后,这属于整个流的错误捕获。一旦某个AJAX请求抛出错误,整个流就会触发catchError并切换到它返回的新流,后续的请求自然不会再执行。
要让所有请求都跑完,哪怕部分失败,你需要给每个单独的AJAX请求添加错误处理,让单个请求的错误被内部消化,不会冒泡中断整个流。
修改后的代码示例
const urls = rxjs.from([ "http://localhost:8000/good-url", // 正常请求 "http://localhost:8000/wrong-url", // 404错误 "http://localhost:8000/another-good-url" // 正常请求 ]).pipe( // 为每个URL对应的AJAX请求单独添加错误处理 rxjs.operators.map(url => rxjs.ajax.ajax({ method: "GET", url: url, responseType: 'text' }).pipe( rxjs.operators.catchError(err => { console.log("请求出错: ", err); // 返回一个包含错误信息的对象,确保流能继续向下传递 return rxjs.of({ status: err.status, isError: true }); }) ) ) ); urls.pipe(rxjs.operators.concatAll()) .subscribe(response => { if (response.isError) { console.log("失败状态码: ", response.status); } else { console.log("成功状态码: ", response.status); } });
更简洁的写法(用concatMap)
你也可以直接用concatMap代替map+concatAll,逻辑更紧凑:
rxjs.from([ "http://localhost:8000/good-url", "http://localhost:8000/wrong-url", "http://localhost:8000/another-good-url" ]).pipe( rxjs.operators.concatMap(url => rxjs.ajax.ajax({ method: "GET", url: url, responseType: 'text' }).pipe( rxjs.operators.catchError(err => { console.log("请求出错: ", err); return rxjs.of({ status: err.status, isError: true }); }) ) ) ).subscribe(response => { response.isError ? console.log("失败状态码: ", response.status) : console.log("成功状态码: ", response.status); });
核心原理
- 当
catchError作用于单个AJAX observable时,它会把错误转换成一个正常的流(比如返回包含错误信息的对象),而不是中断整个父流。 concatAll/concatMap会按顺序订阅每个处理后的observable,哪怕前一个observable遇到错误(但已经被内部catchError处理成正常流),也会继续订阅下一个,保证所有请求都能执行。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

