问题描述
|
我有这样的代码:
for (var i in data) {
for (var j in data[i]) {
for (var k in data[i][j]) {
db.data.insert({i:i,j:j,k:k},emptyCallback);
}
}
}
但是我用完了内存,因为它正在排队所有插入。如何使for循环暂停直到插入完成?
我曾尝试将所有记录推到数组中以便稍后插入,但是随后数组变得太大,并且我再次用完内存。
解决方法
每次调用回调时,您都需要迭代到下一个键,如下所示:
function get_first_keys(data,keys)
{
var ki = Object.keys(data);
for (var i = keys[0]; i < ki.length; ++i)
{
var kj = Object.keys(data[ki[i]]);
for (var j = keys[1]; j < kj.length; ++j)
{
var kk = Object.keys(data[ki[i]][kj[j]]);
for (var k = keys[2]; k < kk.length; ++k)
{
return [i,j,k];
}
}
}
}
function get_next_keys(data,keys)
{
var i = keys[0];
var j = keys[1];
var k = keys[2];
var ki = Object.keys(data);
var kj = Object.keys(data[ki[i]]);
var kk = Object.keys(data[ki[i]][kj[j]]);
if (k + 1 < kk.length)
return [i,k + 1];
if (j + 1 < kj.length)
return get_first_keys(data,[i,j+1,0]);
if (i + 1 < ki.length)
return get_first_keys(data,[i+1,0]);
return;
}
var current_keys = get_first_keys(data,[0,0]);
function insert()
{
if (!current_keys)
return;
key = {};
key.i = Object.keys(data)[current_keys[0]];
key.j = Object.keys(data[key.i])[current_keys[1]];
key.k = Object.keys(data[key.j])[current_keys[2]];
db.data.insert(key,insert);
current_keys = get_next_keys(data,current_keys);
}
insert();
, 简单的答案是递归执行:在回调中进行下一个插入,而不是传递空的回调。