摘要:首先,這是一篇不嚴(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
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
摘要:說(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ū)ο?..
摘要:下面就是對(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ì)有安全警...
摘要:隨著服務(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è)傳...
摘要:隨著服務(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ì)在云端。亞...
摘要:前端開發(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 什么是...
閱讀 3794·2021-11-17 09:33
閱讀 2011·2021-10-26 09:51
閱讀 1527·2021-09-29 09:44
閱讀 1678·2019-08-30 15:55
閱讀 1447·2019-08-30 15:52
閱讀 2325·2019-08-30 15:43
閱讀 3432·2019-08-29 17:00
閱讀 2302·2019-08-29 16:23