Jes*_*sse 19 javascript for-loop event-loop node.js
所以,我一直在考虑一个脑筋急转弯 - 如果我有一个大对象,我出于某种原因不得不在节点js中迭代,并且在我这样做的时候不想阻止事件循环怎么办?
这是一个非常头脑的例子,我相信它可以更清洁:
var forin = function(obj,callback){
var keys = Object.keys(obj),
index = 0,
interval = setInterval(function(){
if(index < keys.length){
callback(keys[index],obj[keys[index]],obj);
} else {
clearInterval(interval);
}
index ++;
},0);
}
Run Code Online (Sandbox Code Playgroud)
虽然我确定它有其他原因让它变得混乱,但这会比常规for循环执行得慢,因为setInterval 0实际上并不是每隔0 ms执行一次,但是我不知道如何用很多循环来执行循环更快的process.nextTick.
在我的测试中,我发现这个例子需要7毫秒才能运行,而不是原生的for循环(使用hasOwnProperty()检查,记录相同的信息),这需要4毫秒.
那么,使用node.js编写相同代码的最干净/最快的方法是什么?
process.nextTick自从提出问题以来,的行为发生了变化。根据功能的清洁度和效率,之前的答案也没有遵循问题。
// in node 0.9.0, process.nextTick fired before IO events, but setImmediate did
// not yet exist. before 0.9.0, process.nextTick between IO events, and after
// 0.9.0 it fired before IO events. if setImmediate and process.nextTick are
// both missing fall back to the tick shim.
var tick =
(root.process && process.versions && process.versions.node === '0.9.0') ?
tickShim :
(root.setImmediate || (root.process && process.nextTick) || tickShim);
function tickShim(fn) {setTimeout(fn, 1);}
// executes the iter function for the first object key immediately, can be
// tweaked to instead defer immediately
function asyncForEach(object, iter) {
var keys = Object.keys(object), offset = 0;
(function next() {
// invoke the iterator function
iter.call(object, keys[offset], object[keys[offset]], object);
if (++offset < keys.length) {
tick(next);
}
})();
}
Run Code Online (Sandbox Code Playgroud)
请注意@alessioalex关于 Kue 和正确作业排队的评论。
另请参阅:share-time,我编写的一个模块,用于执行类似于原始问题意图的操作。