簡體   English   中英

如何使用Rxjs在Angular中調用多個異步方法的數組?

[英]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);
}

至於錯誤處理, mergeforkJoin都會在遇到錯誤時拋出錯誤,您可以在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM