如何在嵌套的for循环中调用异步函数而又不会耗尽内存?

问题描述

| 我有这样的代码
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();
    ,        简单的答案是递归执行:在回调中进行下一个插入,而不是传递空的回调。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...