2016-11-03 28 views
0

我正在此代碼:JS - Web Workers如何工作?

JS

<script src='file://C:\blablabla\JavaScript\bignumber.js-master\bignumber.js'></script> 
<script> 
    document.write("<h1>\"blabla\"</h1>\n<h3>blabla</h3>"); 

    function problem(){ 
     var img = document.getElementById('problemi'); 
     return img.style.display = img.style.display === 'block' ? 'none' : 'block'; 
    } 

    function problem551(){ 
     problem(); 
     var t0 = performance.now(); 
     var max = 1e+15; 
     var sum = new BigNumber(1); 
     for(var i=1;i<max;i++) 
      sum = sum.plus(scomponi(sum,0)); 
     var t1 = performance.now(); 
     document.getElementById("p551").innerHTML = 'blabla<span>'+max+"</span> blabla <span>" + sum +"</span> in <span>"+(t1 - t0)/1000+"</span> blaaa"; 

    } 

    function scomponi(num,sum){ 
     var str=num.toString(); 
     for(var i = 0 ; i< str.length ;i++){ 
      sum += parseInt(str[i]); 
     } 
     return sum; 
    } 


</script> 

HTML

<body> 
    <div> 
     <button onclick="problem551()" >PROBLEM 551</button> 
     <img id="problemi" src="PROBLEM551.png" style="display: none;"> 
     <p id="p551"></p> 
    </div> 
</body> 

但瀏覽器崩潰,它給了我這樣的:

error

如何防止我的功能發生這種錯誤,他有一個循環從1到1e + 15,所以它需要太多的時間。我讀了一些關於網絡工作者的文章,但沒有爲我提供。我想用我的功能problem551(),所以有人可以解釋我是如何工作的?

+0

網絡工作者被推薦用於資源密集型任務,而不是必須長時間運行的任務。首先,您應該看看您是否可以提高現有代碼的性能。 https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers –

+0

在這種情況下'var myWorker = new Worker(「worker.js」);'如果我想使用我的函數isteand worker.js? – Teshtek

+0

你想在那裏做什麼? – Cerbrus

回答

0

移動你的功能到一個新文件,funcs.js

並使用new Worker("funcs.js")啓動它。

您可以使用postMessage將結果發回在MDN描述:

發送信息,並從其專用工人

工人的魔法通過的postMessage()方法和 發生onmessage事件處理程序。當你想將消息發送到 工作者,您發佈消息像這樣(main.js):

first.onchange = function() { 
    myWorker.postMessage([first.value,second.value]); 
    console.log('Message posted to worker'); 
} 

second.onchange = function() { 
    myWorker.postMessage([first.value,second.value]); 
    console.log('Message posted to worker'); 
} 

所以在這裏,我們有由變量表示的兩個元素 第一和第二;當兩者中的任何一個被更改時, myWorker.postMessage([first.value,second.value])用於將內部的 值作爲數組發送給worker。你可以在消息中發送幾乎所有你喜歡的內容。

onmessage = function(e) { 
    console.log('Message received from main script'); 
    var workerResult = 'Result: ' + (e.data[0] * e.data[1]); 
    console.log('Posting message back to main script'); 
    postMessage(workerResult); 
} 

不要指望它仍然需要大量的時間:

在工人,當通過寫 事件處理程序塊這樣的(worker.js)接收到的消息,我們可以迴應,這是一個相當長的操作,但它有望阻止Chrome提出錯誤。


我看到你正在試圖解決項目歐拉問題551

你扔掉了寶貴的信息塊:

您將得到a_10^6 = 31054319.

您不需要從1開始迭代。下一個數字可以是序列中的任意任意數字。

a_10^6 = 31054319 

a_(10^6 + 1) = 31054319 + 3 + 1 + 0 + 5 + 4 + 3 + 1 + 9 
+0

我不要拖延你的最後一部分,你是什麼意思? sum + = scompose(sum)是不是一樣的?好吧,我可以從i = 31054319開始,但需要1秒才能達到這個數字,i = 0 .. – Teshtek

+0

@Teshtek我的不好,我認爲這將需要很長時間計算。 http://eulersolutions.fr.yuku.com/topic/404/PE551是一個有趣的話題。 –