Tapable中文文檔

非直譯筹燕,加入了一些自己的理解衅鹿,原文

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í)行卵慰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裳朋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子送挑,更是在濱河造成了極大的恐慌暖眼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栋豫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蛤铜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門昂羡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摔踱,“玉大人派敷,你說我怎么就攤上這事±河洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颠蕴。 經(jīng)常有香客問我犀被,道長,這世上最難降的妖魔是什么掀泳? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任西轩,我火速辦了婚禮,結(jié)果婚禮上固灵,老公的妹妹穿的比我還像新娘劫流。我一直安慰自己祠汇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布诗力。 她就那樣靜靜地躺著我抠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓣窄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天裳凸,我揣著相機(jī)與錄音姨谷,去河邊找鬼映九。 笑死,一個胖子當(dāng)著我的面吹牛践叠,可吹牛的內(nèi)容都是我干的嚼蚀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弄捕,長吁一口氣:“原來是場噩夢啊……” “哼守谓!你這毒婦竟也來了您单?” 一聲冷哼從身側(cè)響起斋荞,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虐秦,沒想到半個月后平酿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悦陋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年蜈彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺驶。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡幸逆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情还绘,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布拍顷,位于F島的核電站哪替,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菇怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一晌块、第九天 我趴在偏房一處隱蔽的房頂上張望爱沟。 院中可真熱鬧,春花似錦匆背、人聲如沸呼伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括享。三九已至,卻和暖如春珍促,著一層夾襖步出監(jiān)牢的瞬間铃辖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工猪叙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娇斩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓穴翩,卻偏偏與公主長得像犬第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芒帕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容