非直譯筹燕,加入了一些自己的理解衅鹿,原文
Tapable
var Tapable = require("tapable");
Tapable
是一個用于事件發(fā)布訂閱執(zhí)行的插件架構(gòu)
在使用上,你僅僅需要繼承它
function MyClass() {
Tapable.call(this);
}
MyClass.prototype = Object.create(Tapable.prototype);
MyClass.prototype.method = function() {};
或者復(fù)制它的屬性到你的類中
function MyClass2() {
EventEmitter.call(this);
Tapable.call(this);
}
MyClass2.prototype = Object.create(EventEmitter.prototype);
Tapable.mixin(MyClass2.prototype);
MyClass2.prototype.method = function() {};
公開的方法
apply
void apply(plugins: Plugin...)
通過arguments獲得所有傳入的插件對象制妄,并調(diào)用插件對象的apply方法耕捞,注冊插件(所以,一個合法的插件應(yīng)該包含入口方法apply)
plugin
void plugin(names: string|string[], handler: Function)
事件綁定函數(shù)砸脊,參數(shù)說明
names
: 需要監(jiān)聽的事件名稱凌埂,可以傳入事件名稱集合(同時綁定多個事件),也可以傳入單個事件名稱
handler
: 事件的處理函數(shù)
受保護(hù)的方法
applyPlugins
void applyPlugins(name: string, args: any...)
觸發(fā)事件name
埃疫,傳入?yún)?shù)args
孩哑,并行的調(diào)用所有注冊在事件name
上的處理函數(shù)
applyPluginsWaterfall
any applyPluginsWaterfall(name: string, init: any, args: any...)
觸發(fā)事件name
横蜒,串行的調(diào)用注冊在事件name
上的處理函數(shù)(先入先出),最先執(zhí)行的處理函數(shù)傳入init和args丛晌,后續(xù)的處理函數(shù)傳入前一個處理函數(shù)的返回值
和args澎蛛,函數(shù)最終返回最后一個處理函數(shù)的返回結(jié)果
applyPluginsAsync
void applyPluginsAsync(
name: string,
args: any...,
callback: (err?: Error) -> void
)
觸發(fā)事件name
,串行的調(diào)用注冊在事件name
上的處理函數(shù)(先入先出)呆馁,倘若某一個處理函數(shù)報錯毁兆,則執(zhí)行傳入的callback(err)
气堕,后續(xù)的處理函數(shù)將不被執(zhí)行,否則最后一個處理函數(shù)調(diào)用callback
。
插件注冊此類事件盒卸,處理函數(shù)需要調(diào)用callback,這樣才能保證監(jiān)聽鏈的正確執(zhí)行
var myPlugin = function() {
}
myPlugin.prototype.apply(tapable) {
tapable.plugin('name', function(arg1, arg2, arg3, callback)) {
//do something
...
//調(diào)用callback
callback();
}
}
applyPluginsBailResult
any applyPluginsBailResult(name: string, args: any...)
觸發(fā)事件name
摘投,串行的調(diào)用注冊在事件name
上的處理函數(shù)(先入先出)犀呼,傳入?yún)?shù)args,如果其中一個處理函數(shù)返回值!== undefined
坐儿,直接返回這個返回值宋光,后續(xù)的處理函數(shù)將不被執(zhí)行
applyPluginsAsyncWaterfall
applyPluginsAsyncWaterfall(
name: string,
init: any,
callback: (err: Error, result: any) -> void
)
觸發(fā)事件name
,串行的調(diào)用注冊在name
上的處理函數(shù)(先入先出)逛漫,第一個處理函數(shù)傳入?yún)?shù)init
赘艳,后續(xù)的函數(shù)依賴于前一個函數(shù)執(zhí)行回調(diào)的時候傳入的參數(shù)nextValue
,倘若某一個處理函數(shù)報錯枷踏,則執(zhí)行傳入的callback(err)
娇掏,后續(xù)的處理函數(shù)將不被執(zhí)行婴梧,否則最后一個處理函數(shù)調(diào)用callback(value)
插件注冊此類事件,處理函數(shù)需要調(diào)用callback(err, nextValue)孽江,這樣才能保證監(jiān)聽鏈的正確執(zhí)行
var myPlugin = function() {
}
myPlugin.prototype.apply(tapable) {
tapable.plugin('name', function(arg1,..., argx, callback)) {
//do something
...
//調(diào)用callback
var args = Array.prototype.slice.call(arguments, 1);
var callback = args.pop();
callback(null, value);
}
}
applyPluginsAsyncSeries
applyPluginsAsyncSeries(
name: string,
args: any...,
callback: (err: Error, result: any) -> void
)
這個方法同applyPluginsAsync
applyPluginsParallel
applyPluginsParallel(
name: string,
args: any...,
callback: (err?: Error) -> void
)
觸發(fā)事件name
番电,傳入?yún)?shù)args
漱办,并行的調(diào)用所有注冊在事件name
上的處理函數(shù),倘若任一處理函數(shù)執(zhí)行報錯暇屋,則執(zhí)行callback('err')
洞辣,否則當(dāng)所有的處理函數(shù)都執(zhí)行完的時候調(diào)用callback()
同樣的昙衅,插件注冊此類事件的時候定鸟,回調(diào)函數(shù)要執(zhí)行callback
applyPluginsParallelBailResult
applyPluginsParallelBailResult(
name: string,
args: any...,
callback: (err: Error, result: any) -> void
)
觸發(fā)事件name
联予,串行的執(zhí)行注冊在事件name
上的處理函數(shù)(先入先出),每個處理函數(shù)必須調(diào)用callback(err, result)
谭羔,倘若任一處理函數(shù)在調(diào)用callback(err, result)
的時候麦向,err!==undefined || result!==undefined
,則callback
將真正被執(zhí)行话告,后續(xù)的處理函數(shù)則不會再被執(zhí)行卵慰。