AsyncParallelHook
与 AsyncParallelBailHook
异步的勾子分两种串行
和并行
并行
等待所有并发的异步事件执行后执行回调
注册的三种方法
- 异步的注册方法
tap
- 异步的注册方法
tapAsync
, 还有个回调参数 topPromise
,注册promise
调用的三种
- call (同步)
- callAsync (异步)
- promise (异步)
这里介绍的是异步并行的
AsyncParallelHook
不关心监听函数的返回值。
5.use.js
let {AsyncParallelHook} = require('tapable') // 解构同步勾子
// 不返回undefined 会多次执行
class Lesson {
constructor() {
this.index = 0
this.hooks = {
// 订阅勾子
arch: new AsyncParallelHook(['name']),
}
}
start() {
// 发布callAsync
// this.hooks.arch.callAsync('may', function () {
// console.log('end');
// })
// 另一种发布promise
this.hooks.arch.promise('may').then(function () {
console.log('end');
}
)
}
tap() { // 注册监听函数,订阅
// 注册tapAsync
// this.hooks.arch.tapAsync('node', (name, callback) => {
// setTimeout(() => {
// console.log('node', name)
// callback()
// }, 1000)
// })
// this.hooks.arch.tapAsync('react', (name, callback) => {
// setTimeout(() => {
// console.log('react', name)
// callback()
// }, 1000)
// })
// 另一种订阅 tapPromise
this.hooks.arch.tapPromise('node', (name) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('node', name)
resolve()
}, 1000)
})
})
this.hooks.arch.tapPromise('react', (name) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('react', name)
resolve()
}, 1000)
})
})
}
}
let l = new Lesson()
l.tap(); //注册两个函数
l.start() // 启动勾子
5.theory.js
class AsyncParallelHook { // 勾子是同步的 - 瀑布
constructor(args) { // args => ['name']
this.tasks = []
}
tapAsync(name, task) {
this.tasks.push(task)
}
tapPromise(name, task) {
this.tasks.push(task)
}
callAsync(...args) {
let finalCallback = args.pop() // 拿出最终的函数
let index = 0
let done = () => { // 类似promise.all的实现
index++;
if (index === this.tasks.length) {
finalCallback();
}
}
this.tasks.forEach(task => {
task(...args, done) // 这里的args 已经把最后一个参数删掉
})
}
promise(...args) {
let tasks = this.tasks.map(task => task(...args))
return Promise.all(tasks)
}
}
let hook = new AsyncParallelHook(['name'])
// hook.tapAsync('react', function (name, callback) {
// setTimeout(() => {
// console.log('react', name);
// callback()
// }, 1000)
// })
//
// hook.tapAsync('node', function (name, callback) {
// setTimeout(() => {
// console.log('node', name);
// callback()
// }, 1000)
// })
// hook.tapAsync('webpack', function (name, callback) {
// setTimeout(() => {
// console.log('webpack', name);
// callback()
// }, 1000)
// })
hook.tapPromise('react', function (name, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('react', name);
resolve()
}, 1000)
})
})
hook.tapPromise('node', function (name, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('node', name);
resolve()
}, 1000)
})
})
//
// hook.callAsync('jw', function () {
// console.log('end');
// })
hook.promise('jw').then(function () {
console.log('end');
})
AsyncParallelBailHook
只要监听函数的返回值不为 null
,就会忽略后面的监听函数执行,直接跳跃到callAsync
等触发函数绑定的回调函数,然后执行这个被绑定的回调函数。
使用和原理与SyncBailHook
相似