使用HTML5 Web Worker计算斐波那契数列

1,470 阅读1分钟

未使用Web Worker计算斐波那契数列

  • 计算较小数时,浏览器还可以快速响应;
  • 计算大数时,浏览器的UI已经不可以操作了;
  • 刷新一下页面,发现浏览器仍然处于卡死状态;

使用Web Worker计算斐波那契数列

1、创建项目

$ mkdir webworker-demo
$ cd webworker-demo
$ touch index.html main.js worker.js

2、index.html

<html lang="en">
  <head>
    <title>计算斐波那契数列(使用Web Worker)</title>
    <meta charset="UTF-8" /> 
  </head>
  <body>
    <div id="app">
      <h3>计算斐波那契数列(使用Web Worker)</h3>
      <div class="inner">
        <input type="number" id="number" />
        <button id="calc">calculate</button>
        <div id="result"></div>
      </div>
    </div>
  </body>
  <script src="main.js"></script>
</html>

3、main.js

const resultEle = document.querySelector('#result');

// 判断是否支持Worker
if(window.Worker){
	
	// 创建Worker
	const myWorker = new Worker("worker.js");

	// 监听消息
	myWorker.onmessage = e => {
		const result = e.data;
		resultEle.innerHTML = result;
	};

	// 处理错误
	myWorker.onerror = e => {
		resultEle.innerHTML = e.message;
	};

	document.querySelector('#calc').onclick = function(){
		resultEle.innerHTML = 'calculating...';
		var number = document.querySelector('#number').value;

		// 向worker.js发送数据
		myWorker.postMessage(number);
	}
}

4、worker.js

// 计算斐波那契数列
const Fibonacci = (n) => {
	if(n <= 0) { return 0; }
  if(n === 1) { return 1; }
  return Fibonacci(n - 1) + Fibonacci(n - 2);
}

// 监听消息
onmessage = e => {
	const number = e.data;
	const result = Fibonacci(number);
	// 向main.js发送计算后的结果
	postMessage(result);
};

完整代码

webworker-demo