js 责任链模式

32 阅读1分钟

主要用于校验:

class Handler{
    handlerFn=null
    nextHandler = null
    id = undefined
    preHandler = null
    name = undefined
    lastHandlre = null
    constructor(id,handlerFn,name){
        this.id = id
        this.handlerFn = handlerFn
        this.name = name
    }
    setNextHandler(handler) {

        if(!(handler instanceof Handler)){
         throw new Error('请传入一个handler')
        }
        if(this.id!==handler.id){
            throw new Error('请传入同一个id的handler')
        }
        let lastHandlre = this
        let isMarkHandler = null
        do{
            isMarkHandler = lastHandlre
            lastHandlre = lastHandlre.nextHandler
        }while(lastHandlre)
        isMarkHandler.nextHandler = handler   
        handler.preHandler =  isMarkHandler
        return this
    }
    
    run(args){
        let nextHandler = this
        let result = args
        try {
            while(nextHandler){
                console.log('nextHandler.handlerFn',nextHandler)
                result = nextHandler.handlerFn(result)
                if(result===false){
                    throw new Error(false)
                }
                nextHandler = nextHandler.nextHandler
            }
    
        } catch (error) {
            console.log('校验失败',error)
            return false
        }
        return result
    }
    remove(){
       if( this.preHandler){
        this.preHandler.nextHandler = this.nextHandler
        this.nextHandler.preHandler = this.preHandler
       }else{
        window.__beforeSubmit_Handler_Case = window.__beforeSubmit_Handler_Case.nextHandler
       }
    }
}
window.__beforeSubmit_Handler  = Handler
//共识:第一个实例
window.__beforeSubmit_Handler_Case = null
export function createCheckBeforeSubmit(id,handlerFn,name) {
    const _case = new Handler(id,handlerFn,name)
    if(!window.__beforeSubmit_Handler_Case){
        window.__beforeSubmit_Handler_Case = _case
    }else{
        window.__beforeSubmit_Handler_Case.setNextHandler(_case)
    }
    return _case
}