每日一题-修改代码不造成死循环

如下为一道前端试题,要求是修改代码不造成死循环

1
2
3
while (1) {
console.log(Math.random());
}

分析

首先要知道

  • JS是单线程
  • JS不存在真正意义的并行,但存在并发

因此,如上循环如果正常执行必然死循环。如果想不死循环,不block,肯定是异步或者多线程

答案

根据分析的结果就好想到解决办法了。

Web Worker

  • Web Workfer是真正意义上的多线程,所以利用它就可以做到不阻止主线程
  • IE逐步被Edge代替,而worker非IE浏览器下均得到完美支持,因此可以放开使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//main.js
const worker = new Worker('worker.js');
worker.onmessage = function (e) {
// 接收worker传过来的数据
};

// worker.js
while (1) {
const n = Math.random();
console.log(n);
if (n > 0.9) {
postMessage(n);
break;
}
}

Concurrent.Thread.js库

如果不使用web worker,可以使用该库来模拟多线程。原理即是利用异步。

1
2
3
4
5
Concurrent.Thread.create(function () {
while (1) {
console.log(Math.random());
}
});

库链接-戳这里