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

資訊專欄INFORMATION COLUMN

搞笑向, 面向IE8的webworker-ployfill

CoyPan / 3244人閱讀

摘要:首先,這是一篇不嚴(yán)謹(jǐn)?shù)牟┪?。本文僅供參考,無(wú)法在實(shí)際生產(chǎn)中運(yùn)用。首先,在書寫邏輯上是同步的,但其實(shí)加載這個(gè)行為是異步的。其次,依賴事件與主線程進(jìn)行溝通,中間經(jīng)過(guò)的數(shù)據(jù)會(huì)被。

首先,這是一篇不嚴(yán)謹(jǐn)?shù)牟┪摹?/p>

本文僅供參考,無(wú)法在實(shí)際生產(chǎn)中運(yùn)用。

在捯飭文件分片上傳的過(guò)程中,我總是覺得單線程太慢了。

于是想,用webWorker唄。

首先,我們可以查看一下WebWorker的兼容性。根據(jù)MDN文檔來(lái)看,主流瀏覽器都兼容。

但有個(gè)問(wèn)題,MDN表示W(wǎng)ebWorker只支持到IE10.如果要兼容到ie8,勢(shì)必要維護(hù)兩份上傳代碼,怎么破???

發(fā)揮我們聰明才智的時(shí)候到了

好了,我們可以開始開腦洞了,

要聲明的是,我們只是實(shí)現(xiàn)Worker這個(gè)假的構(gòu)造函數(shù)。

首先,WebWorker在書寫邏輯上是同步的,但其實(shí)加載Worker這個(gè)行為是異步的。

其次,WebWorker依賴事件與主線程進(jìn)行溝通,中間經(jīng)過(guò)的數(shù)據(jù)會(huì)被toString()。

再者,WebWorker的api比較簡(jiǎn)單,模擬起來(lái)也比較方便。

首先來(lái)看Worker的interface定義

[Constructor(USVString scriptURL, optional WorkerOptions options), Exposed=(Window,Worker)]
interface Worker : EventTarget {
  void terminate();

  void postMessage(any message, optional sequence transfer = []);
  attribute EventHandler onmessage;
  attribute EventHandler onmessageerror;
};

dictionary WorkerOptions {
  WorkerType type = "classic";
  RequestCredentials credentials = "omit"; // credentials is only used if type is "module"
  DOMString name = "";
};

enum WorkerType { "classic", "module" };

Worker includes AbstractWorker;

Worker接口繼承了EventTarget,所以還能使用addEventListener removeEventListener這倆api

所以我們要實(shí)現(xiàn)一個(gè)假的Worker,需要實(shí)現(xiàn)以下內(nèi)容:

加載Worker腳本

加載規(guī)則為同域名,從根目錄開始尋找。

暫不做blob生成,對(duì)本篇文章主題而言沒(méi)有意義。

實(shí)現(xiàn)以下內(nèi)容

實(shí)現(xiàn)onmessage

實(shí)現(xiàn)onmessageerror (文章中暫不實(shí)現(xiàn))

實(shí)現(xiàn)close

實(shí)現(xiàn)terminate (文章中暫不實(shí)現(xiàn))

實(shí)現(xiàn)addEventListener (文章中暫不實(shí)現(xiàn))

實(shí)現(xiàn)removeEventListener (文章中暫不實(shí)現(xiàn))

實(shí)現(xiàn)個(gè)假事件。

一步一步來(lái)

為了模擬Worker的同步書寫方式

我們需要實(shí)現(xiàn)一個(gè)同步加載腳本的方法?(●?ω?●)

注:在現(xiàn)代瀏覽器里已經(jīng)不贊成使用了

(function (root) {
    var cache = {};

    // debug
    window.__rc = cache;
    var module = {};
    module.exports = null;

    var config = {
        rootPath: ""
    };

    function hash(str) {
      var hash = 5381,
          i    = str.length;

      while(i) {
        hash = (hash * 33) ^ str.charCodeAt(--i);
      }

      /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed
       * integers. Since we want the results to be always positive, convert the
       * signed int to an unsigned by doing an unsigned bitshift. */
      return hash >>> 0;
    }

    var defaultShimFunction = function (code, f) {
        if (f) {
            return f.replace("[[code]]", code);
        }
        return code;
    };
    root.require = function (scriptPath, shim) {
        var path = scriptPath;
        shim = shim || "";
        if (/^(/|https?://)/.test(scriptPath) !== true) {
            path = config.rootPath + scriptPath;
        }
        if (/.js$/.test(path) === false) {
            path += "/index.js";
        }
        var keyName = path + "?hash=" + hash(shim);
        if (cache[path]) {
            if (cache[keyName]) {
                return cache[keyName]
            }
            eval(defaultShimFunction(cache[path], shim));
            return cache[keyName] = module.exports;
        }
        var request = new XMLHttpRequest();
        request.open("GET", path, false);
        request.send(null);
        if (request.status === 200) {
            cache[path] = request.responseText;
            eval(defaultShimFunction(cache[path], shim));
            cache[keyName] = module.exports;
        }
        return cache[keyName];
    };

    root.require.config = function (opts) {
        for (var i in opts) {
            config[i] = opts[i]
        }
    };
}(window));

(?′?`?)上述代碼不要在意,主要實(shí)現(xiàn)的功能其實(shí)就是特別智障的在瀏覽器里同步加載commonjs模塊。。。

加了個(gè)墊片,方便操作

萬(wàn)事具備,只欠東風(fēng)

來(lái)吧,直接上代碼,worker-ployfill.js

window.__wbus = {
    _lis: {},
    on: function (evt, fn) {
        this._lis[evt] = fn;
    },
    off: function (evt) {
        if (!evt) {
            this._lis = {};
            return;
        }
        delete this._lis[evt];
        delete this._lis["close" + evt];
    },
    emit: function (evt, data) {
        this._lis[evt] && this._lis[evt](data);
    }
};

function copy (a) {
    if (typeof a === "object") {
        var c = JSON.stringify(a);
        return JSON.parse(c);
    }
    return a;
}

function FakeEvent (data, id) {
    this.data = copy(data);
    this.type = "message";
    this.id = id;
}

var uuid = 1;

var FakeWorker = function (p) {
    var self = this;
    self._id = uuid++;
    window.__wbus.on(self._id, function (data) {
        var Fe = new FakeEvent(data, self._id);
        self.onmessage && self.onmessage.call(Fe, Fe);
    });

    window.__wbus.on("close" + self._id, function (data) {
        self.terminates();
    });
    var path = location.protocol + "http://" + location.host + "/" + p;
    var wf = require(path, "
        module.exports = function () {
            var self = {};
            self.postMessage = function (data) {
                window.__wbus.emit(" + self._id + ", data);
            };
            self.onmessage = function () {};
            self.close = function () { window.__wbus.emit(close" + self._id + ") };
            [[code]]
            ;return self;
        }
    ");

    this.worker = wf();
};

FakeWorker.prototype.onmessage = function () {
};

FakeWorker.prototype.postMessage = function (data) {
    if (!this.worker) {
        throw new ReferenceError("Worker already stoped!");
    }
    var d = new FakeEvent(data, this._id);
    this.worker.onmessage && this.worker.onmessage.call(d, d);
};

FakeWorker.prototype.terminates = function () {
    this.worker = null;
    window.__wbus.off(this._id);
};

module.exports = FakeWorker;

智障兒童歡樂(lè)多。

來(lái),讓我們玩一把吧,下面是測(cè)試代碼。




    
    測(cè)試23333


    
        {{text}}
    
    
    
    

// worker-test.js
self.onmessage = function (e) {
    console.log("worker thread"),
    console.log("thread id: %s", e.id);
    console.log("msg: %s", JSON.stringify(e.data));
    self.postMessage({
        message: "from FackWorker"
    });
};

你看,智障系列

233333333.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95622.html

相關(guān)文章

  • 再和“面對(duì)象”談戀愛 - 面對(duì)象編程概念(三)

    摘要:說(shuō)到底面向?qū)ο蟛攀浅绦蛘Z(yǔ)言的根本。其實(shí)面向?qū)ο缶幊陶f(shuō)的就是自定義對(duì)象。里并沒(méi)有類的概念,所以嚴(yán)格上來(lái)講這是個(gè)假的面向?qū)ο罄锏拿嫦驅(qū)ο缶幊态F(xiàn)在好了,終于聽到別人鄙視我們了,給我們提供了類這個(gè)概念,其實(shí)是向傳統(tǒng)語(yǔ)言更靠齊了。 通過(guò)前兩篇文章,我們了解了對(duì)象的概念以及面向?qū)ο罄锏南嚓P(guān)概念等知識(shí),那前面說(shuō)了對(duì)象分類里的前兩種,這篇文章要詳細(xì)去說(shuō)第三種自定義對(duì)象,那真正的好戲這就來(lái)了! 面向?qū)ο?..

    Cruise_Chan 評(píng)論0 收藏0
  • QQ郵箱是如何泄密:JSON劫持漏洞攻防原理及演練

    摘要:下面就是對(duì)這種攻擊原理的介紹以及預(yù)防方法。針對(duì)該漏洞的特點(diǎn),通過(guò)覆蓋數(shù)組構(gòu)造函數(shù)以竊取暴露返回?cái)?shù)組,而現(xiàn)在大多數(shù)瀏覽器還無(wú)法防范這種攻擊。在上周的挪威開發(fā)者大會(huì)上,我做了一個(gè)針對(duì)劫持漏洞的演示。 注:作者發(fā)表這篇文章的時(shí)間較早,某些方法可能并不是最好的解決方案,但針對(duì)這種漏洞進(jìn)行的攻擊還依然可見,如早期的:QQMail郵件泄露漏洞。直到現(xiàn)在,你在某些郵箱打開一個(gè)外部鏈妝,依然會(huì)有安全警...

    khlbat 評(píng)論0 收藏0
  • 從“云”到“霧”:云計(jì)算將死亡,取而代之是分布式點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)

    摘要:隨著服務(wù)器轉(zhuǎn)移到云端,比如亞馬遜或谷歌的數(shù)據(jù)中心的亞馬遜或谷歌的計(jì)算機(jī),靠近這些地方的網(wǎng)絡(luò)需要有令人難以置信的吞吐量來(lái)處理所有這些數(shù)據(jù)。已經(jīng)有一些協(xié)議使用這些技術(shù)來(lái)構(gòu)建符合我們需求的分布式存儲(chǔ)。 云將會(huì)走向終結(jié)。我知道,這是一個(gè)大膽的結(jié)論,也許聽起來(lái)有點(diǎn)瘋狂。但請(qǐng)容忍我,讓我說(shuō)下去。一直以來(lái),都有這樣的一個(gè)傳...

    mengbo 評(píng)論0 收藏0
  • 從“云”到“霧”:云計(jì)算將死亡,取而代之是分布式點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)

    摘要:隨著服務(wù)器轉(zhuǎn)移到云端,比如亞馬遜或谷歌的數(shù)據(jù)中心的亞馬遜或谷歌的計(jì)算機(jī),靠近這些地方的網(wǎng)絡(luò)需要有令人難以置信的吞吐量來(lái)處理所有這些數(shù)據(jù)。已經(jīng)有一些協(xié)議使用這些技術(shù)來(lái)構(gòu)建符合我們需求的分布式存儲(chǔ)。 云將會(huì)走向終結(jié)。我知道,這是一個(gè)大膽的結(jié)論,也許聽起來(lái)有點(diǎn)瘋狂。但請(qǐng)容忍我,讓我說(shuō)下去。一直以來(lái),都有這樣的一個(gè)傳統(tǒng)觀點(diǎn):運(yùn)行服務(wù)器的應(yīng)用程序,無(wú)論是Web應(yīng)用還是移動(dòng)應(yīng)用的后臺(tái),未來(lái)都會(huì)在云端。亞...

    teren 評(píng)論0 收藏0
  • 關(guān)于前端跨域總結(jié)

    摘要:前端開發(fā)中,跨域使我們經(jīng)常遇到的一個(gè)問(wèn)題,也是面試中經(jīng)常被問(wèn)到的一些問(wèn)題,所以,這里,我們做個(gè)總結(jié)。同源策略限制了一下行為和無(wú)法讀取和對(duì)象無(wú)法獲取請(qǐng)求發(fā)送不出去常見的跨域場(chǎng)景所謂的同源是指,域名協(xié)議端口均為相同。 前端開發(fā)中,跨域使我們經(jīng)常遇到的一個(gè)問(wèn)題,也是面試中經(jīng)常被問(wèn)到的一些問(wèn)題,所以,這里,我們做個(gè)總結(jié)。小小問(wèn)題,不足擔(dān)心 原文地址:YOU-SHOULD-KNOW-JS 什么是...

    muddyway 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<