摘要:所有注冊的處理方法并行執(zhí)行,相互獨立互不干擾。倘若某一個處理函數(shù)報錯,則執(zhí)行傳入的,后續(xù)的處理函數(shù)將不被執(zhí)行,否則最后一個處理函數(shù)調(diào)用。順序由注冊插件順序決定,而不是由函數(shù)的執(zhí)行時間。如果為此名稱注冊了插件,則返回。
Tapable
https://github.com/webpack/ta...
https://segmentfault.com/a/11...
var Tapable = require("tapable");
Tapable 是一個用于插件綁定的類
繼承方式1
function MyClass() { Tapable.call(this); } MyClass.prototype = Object.create(Tapable.prototype); MyClass.prototype.method = function() {};
繼承方式2
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...)
通過調(diào)用apply它們將作為參數(shù)傳遞的所有插件附加到實例。
pluginvoid plugin(names: string|string[], handler: Function)
names需要監(jiān)聽的事件名稱,可以傳入事件名稱集合(同時綁定多個事件),也可以傳入單個事件名稱
handler 事件的處理函數(shù)
void applyPlugins(name: string, args: any...)
同步調(diào)用所有的name插件,傳入?yún)?shù)args,并行的調(diào)用所有注冊在事件name上的處理函數(shù)。所有注冊的處理方法并行執(zhí)行,相互獨立互不干擾。(根據(jù)傳參格式內(nèi)部提供了applyPlugins0,applyPlugins1,applyPlugins2)
function applyPlugins1(name, param) { var plugins = this._plugins[name]; if(!plugins) return; for(var i = 0; i < plugins.length; i++) plugins[i].call(this, param); };applyPluginsWaterfall
any applyPluginsWaterfall(name: string, init: any, args: any...)
串行的調(diào)用所有的name插件,
第一個處理函數(shù)傳入init和args,
后續(xù)的處理函數(shù)傳入前一個處理函數(shù)的返回值和args,
最終返回最后一個處理函數(shù)的返回結(jié)果
(內(nèi)部同樣提供了012方法)
function applyPluginsWaterfall1(name, init, param) { var plugins = this._plugins[name]; if(!plugins) return init; var current = init; for(var i = 0; i < plugins.length; i++) current = plugins[i].call(this, current, param); return current; };applyPluginsAsync | applyPluginsAsyncSeries
void applyPluginsAsync( name: string, args: any..., callback: (err?: Error) -> void )
異步調(diào)用所有的name插件(依次執(zhí)行),倘若某一個處理函數(shù)報錯,則執(zhí)行傳入的callback(err),后續(xù)的處理函數(shù)將不被執(zhí)行,否則最后一個處理函數(shù)調(diào)用callback
function applyPluginsAsyncSeries1(name, param, callback) { var plugins = this._plugins[name]; if(!plugins || plugins.length === 0) return callback(); var i = 0; var _this = this; var innerCallback = copyProperties(callback, function next(err) { if(err) return callback(err); i++; if(i >= plugins.length) { return callback(); } plugins[i].call(_this, param, innerCallback); }); plugins[0].call(this, param, innerCallback); };applyPluginsBailResult
any applyPluginsBailResult(name: string, args: any...)
同步調(diào)用所有的name插件,如果其中一個處理函數(shù)返回值!== undefined,直接返回這個返回值,后續(xù)的處理函數(shù)將不被執(zhí)行
function applyPluginsBailResult1(name, param) { if(!this._plugins[name]) return; var plugins = this._plugins[name]; for(var i = 0; i < plugins.length; i++) { var result = plugins[i].call(this, param); if(typeof result !== "undefined") { return result; } } };applyPluginsAsyncWaterfall
applyPluginsAsyncWaterfall( name: string, init: any, callback: (err: Error, result: any) -> void )
異步調(diào)用所有的name插件。后續(xù)的函數(shù)依賴于前一個函數(shù)執(zhí)行回調(diào)的時候傳入的參數(shù)nextValue(第一個處理函數(shù)傳入?yún)?shù)init)。
倘若某一個處理函數(shù)報錯,則執(zhí)行傳入的callback(err),后續(xù)的處理函數(shù)將不被執(zhí)行,否則最后一個處理函數(shù)調(diào)用callback(value)。
function applyPluginsAsyncWaterfall(name, init, callback) { if(!this._plugins[name] || this._plugins[name].length === 0) return callback(null, init); var plugins = this._plugins[name]; var i = 0; var _this = this; var next = copyProperties(callback, function(err, value) { if(err) return callback(err); i++; if(i >= plugins.length) { return callback(null, value); } plugins[i].call(_this, value, next); }); plugins[0].call(this, init, next); };applyPluginsParallel
applyPluginsParallel( name: string, args: any..., callback: (err?: Error) -> void )
并行的調(diào)用所有注冊在事件name上的處理函數(shù),倘若任一處理函數(shù)執(zhí)行報錯,則執(zhí)行callback("err"),否則當(dāng)所有的處理函數(shù)都執(zhí)行完的時候調(diào)用callback()
function applyPluginsParallel(name) { var args = Array.prototype.slice.call(arguments, 1); var callback = args.pop(); if(!this._plugins[name] || this._plugins[name].length === 0) return callback(); var plugins = this._plugins[name]; var remaining = plugins.length; args.push(copyProperties(callback, function(err) { if(remaining < 0) return; // ignore if(err) { remaining = -1; return callback(err); } remaining--; if(remaining === 0) { return callback(); } })); for(var i = 0; i < plugins.length; i++) { plugins[i].apply(this, args); if(remaining < 0) return; } };applyPluginsParallelBailResult
applyPluginsParallelBailResult( name: string, args: any..., callback: (err: Error, result: any) -> void )
并行調(diào)用,每個處理函數(shù)必須調(diào)用callback(err, result),
倘若任一處理函數(shù)在調(diào)用callback(err, result)的時候,err!==undefined || result!==undefined,則callback將真正被執(zhí)行,后續(xù)的處理函數(shù)則不會再被執(zhí)行。
順序由注冊插件順序決定,而不是由函數(shù)的執(zhí)行時間。
applyPluginsParallelBailResult1(name, param, callback) { var plugins = this._plugins[name]; if(!plugins || plugins.length === 0) return callback(); var currentPos = plugins.length; var currentResult; var done = []; for(var i = 0; i < plugins.length; i++) { var innerCallback = (function(i) { return copyProperties(callback, function() { if(i >= currentPos) return; // ignore done.push(i); if(arguments.length > 0) { currentPos = i + 1; done = fastFilter.call(done, function(item) { return item <= i; }); currentResult = Array.prototype.slice.call(arguments); } if(done.length === currentPos) { callback.apply(null, currentResult); currentPos = 0; } }); }(i)); plugins[i].call(this, param, innerCallback); } };hasPlugins
hasPlugins( name: string )
如果為此名稱注冊了插件,則返回true。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/108639.html
摘要:背景在工作中雖然我經(jīng)常使用到庫但是很多時候?qū)Φ囊恍└拍钸€是處于知其然不知其所以然的狀態(tài)因此就萌生了學(xué)習(xí)源碼的想法剛開始看源碼的時候自然是比較痛苦的主要原因有兩個第一網(wǎng)上沒有找到讓我滿意的詳盡的源碼分析的教程第二我也是第一次系統(tǒng)地學(xué)習(xí)這么大代 背景 在工作中, 雖然我經(jīng)常使用到 Netty 庫, 但是很多時候?qū)?Netty 的一些概念還是處于知其然, 不知其所以然的狀態(tài), 因此就萌生了學(xué)...
摘要:簡介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是方法,該方法用于對已完成屬性填充的做最后的初始化工作。后置處理器是拓展點之一,通過實現(xiàn)后置處理器接口,我們就可以插手的初始化過程。 1. 簡介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是 initializeBean 方法,該方法用于對已完成屬性填充的 bean 做最...
摘要:為了避免一篇文章的篇幅過長,于是一些比較大的主題就都分成幾篇來講了,這篇文章是筆者所有文章的目錄,將會持續(xù)更新,以給大家一個查看系列文章的入口。 前言 大家好,筆者是今年才開始寫博客的,寫作的初衷主要是想記錄和分享自己的學(xué)習(xí)經(jīng)歷。因為寫作的時候發(fā)現(xiàn),為了弄懂一個知識,不得不先去了解另外一些知識,這樣以來,為了說明一個問題,就要把一系列知識都了解一遍,寫出來的文章就特別長。 為了避免一篇...
摘要:雖然蘋果官方提供了關(guān)于的與使用說明,但這并不能滿足開發(fā)者們的需求,各類復(fù)雜場景依舊讓我們焦頭爛額,而解決方案卻不易尋找。二源碼下載編譯及調(diào)試之前我們首先需要獲取一份蘋果官方的源碼。 一、前言移動互聯(lián)網(wǎng)時代,網(wǎng)頁依舊是內(nèi)容展示的重要媒介,這離不開 WebKit 瀏覽內(nèi)核技術(shù)的支持與發(fā)展。在 iOS 平臺下開發(fā)者們...
閱讀 1627·2021-09-26 09:46
閱讀 2724·2021-09-07 09:59
閱讀 2811·2021-09-07 09:59
閱讀 1969·2019-08-30 14:20
閱讀 1000·2019-08-26 13:39
閱讀 3233·2019-08-26 12:24
閱讀 831·2019-08-26 11:55
閱讀 1276·2019-08-23 16:49