真巧,晚上刚翻译完Node.js高级编程第六章,讲的就是setInterval和setTimeout,不知道你说的“效率更好”指的什么,作者用setInterval代替setTimeout的目的是为了确保回调函数的串行执行,估计1楼neuront用setTimeout递归替代setInterval就是这个目的。,可以去看看第六章pdf的倒数第2页,不知道对你有用没。
毫秒数参数的有效范围是 1~0x7FFFFFFF, 不在这个范围内都会被置为 1.
另外, setTimeout
不是一个 Javascript 版的 Thread.sleep
函数. 它将无参函数加入事件队列, 并在至少 X 毫秒后执行. js 是单线程的, 因此在设定的时间如果有其它函数还在运作那么被设定延迟执行的函数只能等待了.
@hades jQuery源码里很多地方都用到了setTimeout(callback)可以去看看。打个比方:
function read_data(){
read_file();
write_log();
//setTimeout(write_log,0);
}
read_data();
show_data();
假设write_log()花费1秒,那么read_data()得多等1秒才能返回,然后show_data()才能把数据展示给用户。但是用户根本不关心你的日志,让用户为此多等1秒其实毫无意义,这种场景就可以用setTimeout(callback,0)来调用write_log,让read_data()立刻返回并将数据展示给用户。node里可以用nextTick,会更快一些。
@jiyinyiyong node 文档给的解释是这等价于 setTimeout(callback, 1)
但是更有效率因为底层实现不一样. 可以用来做异步递归, 如
function factorial(n) {
if (n < 2) return 1;
return n * factorial(n - 1)
}
n 特别大的时候会导致进程阻塞所以可以改写成下面的异步版本
function factorial(n, fac, cb) {
if (n < 2) return cb(fac);
process.nextTick(function() {
factorial(n - 1, fac * n, cb);
});
}
但不管怎么说我觉得这样还是太奇葩了, 肯定是什么地方不该用 js 的用了 js.