鉴于此代码:
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()
,但我无法真正看到如何使用对象执行此操作。
答案 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()
函数,它允许您在给定的一个之后找到下一个键/值对。
如果您关心条目的顺序,则需要将原始键/值对存储在数组中,而不是对象中。