2011-06-14 12 views
1

我有這樣的代碼:如何在嵌套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循環暫停,直到插入完成?

我試過把所有的記錄都推送到一個數組中,以後再插入,但是這個數組變得太大了,我又用盡了內存。

回答

0

需要迭代到下一個關鍵每次回調被調用,像這樣:

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, j, 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, 0]); 
    return; 
} 


var current_keys = get_first_keys(data, [0, 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(); 
+0

這個工作非常正確的開箱即用。謝謝! – Eliss 2011-06-15 05:15:12

0

簡單的答案是遞歸執行:在回調中執行下一個插入,而不是傳遞空的回調。