【问题标题】:How to call array of multiple async methods in Angular using Rxjs?如何使用 Rxjs 在 Angular 中调用多个异步方法的数组?
【发布时间】:2019-01-27 04:39:42
【问题描述】:

我有 Base Validator 方法,其中包含 ivalidator 列表。

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() 方法,该方法返回一个observable。

export interface IValidator {
    validate(): Observable<ValidatorModel>;
}

ValidatorModel 是

export class ValidatorModel {
    readonly isSuccessful: boolean;
    errors: Array<string>;
}

我的问题是:

如何循环遍历所有验证器并调用其 ASYNC 方法 一个接一个,有错误就break和return???

【问题讨论】:

    标签: angular typescript asynchronous rxjs


    【解决方案1】:

    如果您希望逐一执行验证,请使用 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);
    }
    

    至于错误处理,mergeforkJoin 在遇到它们时都会抛出错误,您可以在 subscribe() 处理程序中处理它。如果您对Observable&lt;ValidatorModel&gt; 执行(管道)更多操作,则错误将被抛出最终堆栈:

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

    【讨论】:

    • 那么,当我发现其中一个验证器“出错”时,我该如何“破解”?
    • 我的意思是我想根据 isSuccessful 标志而不是“抛出”异常来处理错误。
    • 还有编译时错误 Observable.merge(obs) 返回 Observable>
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-12-17
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多