在javascript中编写非阻塞for循环的最干净的方法是什么?

所以,我一直在想一个大脑预告片 – 如果我有一个大的对象,由于某些原因我必须在节点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);
}

虽然我确定有其他原因是凌乱的,但是这将比常规for循环执行得慢,因为setInterval 0实际上并不是每0 ms执行一次,但是我不知道如何使用多个循环更快的process.nextTick。

在我的测试中,我发现这个例子需要7 ms运行,而不是一个本机for循环(hasOwnProperty()检查,记录相同的信息),这需要4 ms。

那么,使用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);
    }
  })();
}

请注意0​​7000关于Kue和正确的工作排队。

另请参阅:share-time,我写了一个模块来做类似于原始问题的意图。

http://stackoverflow.com/questions/7998943/whats-the-cleanest-way-to-write-a-non-blocking-for-loop-in-javascript

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在javascript中编写非阻塞for循环的最干净的方法是什么?