tapable介绍 - SyncLoopHook
SyncLoopHook
当监听函数被触发的时候,如果该监听函数返回true
时则这个监听函数会反复执行,如果返回 undefined
则表示退出循环
4.use.js
let {SyncLoopHook} = require('tapable') // 解构同步勾子
// 不返回undefined 会多次执行
class Lesson {
constructor () {
this.index = 0
this.hooks = {
// 订阅勾子
arch: new SyncLoopHook(['name']),
}
}
start () {
// 发布
this.hooks.arch.call('may')
}
tap () { // 注册监听函数,订阅
this.hooks.arch.tap('node', (name) => {
console.log('node', name)
return ++this.index === 3 ? undefined : '继续学'
})
this.hooks.arch.tap('react', (name) => {
console.log('react', name)
})
}
}
let l = new Lesson()
l.tap(); //注册两个函数
l.start() // 启动勾子
4.theory.js
class SyncLoopHook { // 勾子是同步的 - 瀑布
constructor(args) { // args => ['name']
this.tasks = []
}
tap (name, task) {
this.tasks.push(task)
}
call (...args) {
this.tasks.forEach(task => {
let ret
do {
ret = task(...args);
} while(ret !== undefined)
})
}
}
let hook = new SyncLoopHook(['name'])
let total = 0
hook.tap('react', function (name) {
console.log('react', name);
return ++total === 3 ? undefined: '继续学'
})
hook.tap('node', function (name) {
console.log('node', name);
})
hook.tap('webpack', function (data) {
console.log('webpack', data);
})
hook.call('jw')