【发布时间】:2014-07-03 18:44:49
【问题描述】:
考虑以下 javascript 算法:
for(var i = 0; i < 50; i ++){
console.log('starting :', i);
getPrimes(1000000);
(function(i){
setTimeout(function(){
console.log('done :', i);
}, 1000);
})(i);
}
function getPrimes(max) {
var sieve = [], i, j, primes = [];
for (i = 2; i <= max; ++i) {
if (!sieve[i]) {
// i has not been marked -- it is prime
primes.push(i);
for (j = i << 1; j <= max; j += i) {
sieve[j] = true;
}
}
}
return primes;
}
for 循环启动 getPrimes 函数,该函数需要一些时间,然后运行另一个超时为一秒的函数。考虑到这个算法,我期望在控制台上得到的是从开始到结束排序但不一定从 1 到 50 排序的“开始”和“完成”行之间的混合。
实际上,我得到的是 50 行“开始”(需要一些时间来处理),然后是 50 行“完成”。
我的问题是为什么?逻辑告诉在运行 for 循环时,至少应该完成一个 timout 回调,并且因为 javascript 是单线程异步的,它应该在一些“starting”行之间显示一行“done”
可能是因为素数计算占用了所有cpu功率?
谢谢
【问题讨论】:
-
Could it be because the primes calculation takes all the cpu power?在任务管理器里找就行了。 -
´setTimeout´ 并不是“在 x 毫秒后运行”,而是“在 x 毫秒后运行,但前提是 CPU 准备就绪”。 Javascript 永远不会在同步代码块的中间运行 setTimeout。
标签: javascript