国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

FE.SRC-webpack/tapable-0.2 源碼分析

luckyyulin / 3172人閱讀

摘要:所有注冊的處理方法并行執行,相互獨立互不干擾。倘若某一個處理函數報錯,則執行傳入的,后續的處理函數將不被執行,否則最后一個處理函數調用。順序由注冊插件順序決定,而不是由函數的執行時間。如果為此名稱注冊了插件,則返回。

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...)

通過調用apply它們將作為參數傳遞的所有插件附加到實例。

plugin
void plugin(names: string|string[], handler: Function)

names需要監聽的事件名稱,可以傳入事件名稱集合(同時綁定多個事件),也可以傳入單個事件名稱
handler 事件的處理函數

私有方法 applyPlugins
void applyPlugins(name: string, args: any...)

同步調用所有的name插件,傳入參數args,并行的調用所有注冊在事件name上的處理函數。所有注冊的處理方法并行執行,相互獨立互不干擾。(根據傳參格式內部提供了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...)

串行的調用所有的name插件,
第一個處理函數傳入init和args,
后續的處理函數傳入前一個處理函數的返回值和args,
最終返回最后一個處理函數的返回結果
(內部同樣提供了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
)

異步調用所有的name插件(依次執行),倘若某一個處理函數報錯,則執行傳入的callback(err),后續的處理函數將不被執行,否則最后一個處理函數調用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...)

同步調用所有的name插件,如果其中一個處理函數返回值!== undefined,直接返回這個返回值,后續的處理函數將不被執行

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
)

異步調用所有的name插件。后續的函數依賴于前一個函數執行回調的時候傳入的參數nextValue(第一個處理函數傳入參數init)。
倘若某一個處理函數報錯,則執行傳入的callback(err),后續的處理函數將不被執行,否則最后一個處理函數調用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
)

并行的調用所有注冊在事件name上的處理函數,倘若任一處理函數執行報錯,則執行callback("err"),否則當所有的處理函數都執行完的時候調用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
)

并行調用,每個處理函數必須調用callback(err, result),
倘若任一處理函數在調用callback(err, result)的時候,err!==undefined || result!==undefined,則callback將真正被執行,后續的處理函數則不會再被執行。
順序由注冊插件順序決定,而不是由函數的執行時間。

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。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108639.html

相關文章

  • 源碼之下無秘密 ── 做最好的 Netty 源碼分析教程

    摘要:背景在工作中雖然我經常使用到庫但是很多時候對的一些概念還是處于知其然不知其所以然的狀態因此就萌生了學習源碼的想法剛開始看源碼的時候自然是比較痛苦的主要原因有兩個第一網上沒有找到讓我滿意的詳盡的源碼分析的教程第二我也是第一次系統地學習這么大代 背景 在工作中, 雖然我經常使用到 Netty 庫, 但是很多時候對 Netty 的一些概念還是處于知其然, 不知其所以然的狀態, 因此就萌生了學...

    shenhualong 評論0 收藏0
  • Spring IOC 容器源碼分析 - 余下的初始化工作

    摘要:簡介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是方法,該方法用于對已完成屬性填充的做最后的初始化工作。后置處理器是拓展點之一,通過實現后置處理器接口,我們就可以插手的初始化過程。 1. 簡介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是 initializeBean 方法,該方法用于對已完成屬性填充的 bean 做最...

    Alfred 評論0 收藏0
  • 系列文章目錄

    摘要:為了避免一篇文章的篇幅過長,于是一些比較大的主題就都分成幾篇來講了,這篇文章是筆者所有文章的目錄,將會持續更新,以給大家一個查看系列文章的入口。 前言 大家好,筆者是今年才開始寫博客的,寫作的初衷主要是想記錄和分享自己的學習經歷。因為寫作的時候發現,為了弄懂一個知識,不得不先去了解另外一些知識,這樣以來,為了說明一個問題,就要把一系列知識都了解一遍,寫出來的文章就特別長。 為了避免一篇...

    lijy91 評論0 收藏0
  • 系列文章目錄

    摘要:為了避免一篇文章的篇幅過長,于是一些比較大的主題就都分成幾篇來講了,這篇文章是筆者所有文章的目錄,將會持續更新,以給大家一個查看系列文章的入口。 前言 大家好,筆者是今年才開始寫博客的,寫作的初衷主要是想記錄和分享自己的學習經歷。因為寫作的時候發現,為了弄懂一個知識,不得不先去了解另外一些知識,這樣以來,為了說明一個問題,就要把一系列知識都了解一遍,寫出來的文章就特別長。 為了避免一篇...

    Yumenokanata 評論0 收藏0
  • 深入理解 WKWebView(入門篇)—— WebKit 源碼調試與分析

    摘要:雖然蘋果官方提供了關于的與使用說明,但這并不能滿足開發者們的需求,各類復雜場景依舊讓我們焦頭爛額,而解決方案卻不易尋找。二源碼下載編譯及調試之前我們首先需要獲取一份蘋果官方的源碼。 一、前言移動互聯網時代,網頁依舊是內容展示的重要媒介,這離不開 WebKit 瀏覽內核技術的支持與發展。在 iOS 平臺下開發者們...

    funnyZhang 評論0 收藏0

發表評論

0條評論

luckyyulin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<