请求,一系列请求处理对象组成的链表,请求在链表中传递的过程中,选择合适的处理对象去处理请求
var Chain = function(fn) {
// 职责处理函数
this.fn = fn
// 下一个职责对象节点
this.successor = null
}
Chain.prototype = {
setNextSuccessor: function(successor){
return this.successor = successor
},
passRequest: function() {
var ret = this.fn.apply(this, arguments)
if (ret === 'nextSuccessor') {
return this.successor && this.successor.passRequest.apply(this.successor, arguments)
}
return ret
},
next:function() {
return this.successor && this.successor.passRequest.apply(this.successor, arguments)
}
}
// 创建职责链 处理请求节点
var chain0 = new Chain(function(type) {
if (type === 0) {
console.log('deal request in chain:' + type)
} else {
return 'nextSuccessor'
}
})
var chain1 = new Chain(function(type) {
if (type === 1) {
console.log('deal request in chain:' + type)
} else {
return 'nextSuccessor'
}
})
var chain2 = new Chain(function(type) {
if (type === 2) {
console.log('deal request in chain:' + type)
} else {
return 'nextSuccessor'
}
})
// 连接 节点
chain0.setNextSuccessor(chain1).setNextSuccessor(chain2)
// 发出请求
chain0.passRequest(1) // 输出: deal request in chain:1
上面是请求在职责链间传递是同步的,如果需要异步,可以手动传递请求给职责链下一个节点
var chain3 = new Chain(function(type) {
console.log(3)
if (type === 3) {
console.log('deal request in chain:' + type)
} else {
console.log('deal request async')
var self = this
setTimeout(function(){
self.next(type)
}, 2000)
}
})
var chain4 = new Chain(function(type) {
console.log(4)
if (type === 4) {
console.log('deal request in chain:' + type)
} else {
return 'nextSuccessor'
}
})
// 连接 节点
chain0.setNextSuccessor(chain1).setNextSuccessor(chain2).setNextSuccessor(chain3).setNextSuccessor(chain4)
// 发出请求
chain0.passRequest(4) //deal request in chain:4