[英]How to call array of multiple async methods in Angular using Rxjs?
我有具有ivalidator
列表的Base Validator
方法。
import { IValidator, ValidatorModel } from "../validation/ivalidator";
import { Observable } from "rxjs/Observable";
export abstract class BaseValidator implements IValidator {
private validators = new Array<IValidator>();
//Validators are pushed to the base validator =>Not implemented yet
validate(): Observable<ValidatorModel> {
for (let i = 0; i < this.validators.length; i++) {
//How do I loop thru all the validator and call its ASYNC method
//one by one and break and return when there is an error ???
}
}
}
每个validator
方法都公开validate()
方法,该方法返回一个可观察值。
export interface IValidator {
validate(): Observable<ValidatorModel>;
}
ValidatorModel是
export class ValidatorModel {
readonly isSuccessful: boolean;
errors: Array<string>;
}
我的问题是:
我如何遍历所有验证器并一个接一个地调用其ASYNC方法,并在出现错误时中断并返回?
如果要一次一次执行验证,请使用merge
运算符:
validate(): Observable<ValidatorModel> {
let obs = this.validators.map(validator=>validator.validate());
return Observable.merge(obs);
}
如果希望同时并行执行验证,请使用forkJoin
运算符:
validate(): Observable<ValidatorModel> {
let obs = this.validators.map(validator=>validator.validate());
return Observable.forkJoin(obs);
}
至于错误处理, merge
和forkJoin
都会在遇到错误时抛出错误,您可以在您的forkJoin
subscribe()
处理程序中进行处理。 如果您要对Observable<ValidatorModel>
做更多的操作,那么错误将被抛出最终的堆栈:
someValidator.subscribe(
(results) => {
},
(error) => {
//handle error here
},
() => {
//observable completed
})
如果选择显式处理基类中的错误,请使用catch
运算符:
return Observable.forkJoin(obs)
.catch(error=>{
console.log('error encountered',error);
//handle your errors here
//Return an empty Observable to terminate the stream
return Observable.empty();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.