异步迭代对象键/值

时间:2011-12-27 17:09:25

标签: javascript node.js

鉴于此代码:

var o = {
  k1: 'v1',
  k2: 'v2',
  k3: 'v3'
};

var stupidf = function(k, v, callback) {
  setTimeout(function() {
     console.log(k + "=" + v);
     callback();
  }, 2000};
};

产生输出的最佳方法是什么:

// after 2 seconds
stdout: k1=v1
// after 4 seconds
stdout: k2=v2
// after 6 seconds
stdout: k3=v3

使用数组,您可以使用回调制作副本并push(),但我无法真正看到如何使用对象执行此操作。

1 个答案:

答案 0 :(得分:1)

您假设o中的条目迭代具有保证顺序; it does not。假设你不关心你得到它们的顺序:

function asyncIterate(o,callback,timeout){
  var kv=[], i=0;
  for (var k in o) if (o.hasOwnProperty(k)) kv.push([k,o[k]);
  var iterator = function(){
    callback(kv[i][0],kv[i][1]);
    if (++i < kv.length) setTimeout(iterator,timeout); 
  }
  setTimeout(iterator,timeout);
}
asyncIterate(o,function(k,v){
  console.log(k+'='+v);
},2000);

JavaScript没有Lua的next()函数,它允许您在给定的一个之后找到下一个键/值对。

如果您关心条目的顺序,则需要将原始键/值对存储在数组中,而不是对象中。