非直譯,加入了一些自己的理解,原文
Tapable
var Tapable = require("tapable");
Tapable
是一個用于事件發布訂閱執行的插件架構
在使用上,你僅僅需要繼承它
function MyClass() {
Tapable.call(this);
}
MyClass.prototype = Object.create(Tapable.prototype);
MyClass.prototype.method = function() {};
或者復制它的屬性到你的類中
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獲得所有傳入的插件對象,并調用插件對象的apply方法,注冊插件(所以,一個合法的插件應該包含入口方法apply)
plugin
void plugin(names: string|string[], handler: Function)
事件綁定函數,參數說明
names
: 需要監聽的事件名稱,可以傳入事件名稱集合(同時綁定多個事件),也可以傳入單個事件名稱
handler
: 事件的處理函數
受保護的方法
applyPlugins
void applyPlugins(name: string, args: any...)
觸發事件name
,傳入參數args
,并行的調用所有注冊在事件name
上的處理函數
applyPluginsWaterfall
any applyPluginsWaterfall(name: string, init: any, args: any...)
觸發事件name
,串行的調用注冊在事件name
上的處理函數(先入先出),最先執行的處理函數傳入init和args,后續的處理函數傳入前一個處理函數的返回值
和args,函數最終返回最后一個處理函數的返回結果
applyPluginsAsync
void applyPluginsAsync(
name: string,
args: any...,
callback: (err?: Error) -> void
)
觸發事件name
,串行的調用注冊在事件name
上的處理函數(先入先出),倘若某一個處理函數報錯,則執行傳入的callback(err)
,后續的處理函數將不被執行,否則最后一個處理函數調用callback
。
插件注冊此類事件,處理函數需要調用callback,這樣才能保證監聽鏈的正確執行
var myPlugin = function() {
}
myPlugin.prototype.apply(tapable) {
tapable.plugin('name', function(arg1, arg2, arg3, callback)) {
//do something
...
//調用callback
callback();
}
}
applyPluginsBailResult
any applyPluginsBailResult(name: string, args: any...)
觸發事件name
,串行的調用注冊在事件name
上的處理函數(先入先出),傳入參數args,如果其中一個處理函數返回值!== undefined
,直接返回這個返回值,后續的處理函數將不被執行
applyPluginsAsyncWaterfall
applyPluginsAsyncWaterfall(
name: string,
init: any,
callback: (err: Error, result: any) -> void
)
觸發事件name
,串行的調用注冊在name
上的處理函數(先入先出),第一個處理函數傳入參數init
,后續的函數依賴于前一個函數執行回調的時候傳入的參數nextValue
,倘若某一個處理函數報錯,則執行傳入的callback(err)
,后續的處理函數將不被執行,否則最后一個處理函數調用callback(value)
插件注冊此類事件,處理函數需要調用callback(err, nextValue),這樣才能保證監聽鏈的正確執行
var myPlugin = function() {
}
myPlugin.prototype.apply(tapable) {
tapable.plugin('name', function(arg1,..., argx, callback)) {
//do something
...
//調用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
)
觸發事件name
,傳入參數args
,并行的調用所有注冊在事件name
上的處理函數,倘若任一處理函數執行報錯,則執行callback('err')
,否則當所有的處理函數都執行完的時候調用callback()
同樣的,插件注冊此類事件的時候,回調函數要執行callback
applyPluginsParallelBailResult
applyPluginsParallelBailResult(
name: string,
args: any...,
callback: (err: Error, result: any) -> void
)
觸發事件name
,串行的執行注冊在事件name
上的處理函數(先入先出),每個處理函數必須調用callback(err, result)
,倘若任一處理函數在調用callback(err, result)
的時候,err!==undefined || result!==undefined
,則callback
將真正被執行,后續的處理函數則不會再被執行。