2014-01-16 30 views
0

對Mongodb進行成功查詢以獲取新聞列表後,對於有鏈接的新聞,我搜索數據庫中的鏈接詳細信息,但是在將它們設置在修改後的新聞對象中無法將其推送到數組。爲什麼會發生?NodeJS不能使用嵌套查詢創建數組

var newsarray = [] 
for(i=0;i<newsfound.length;i++){ 
    if(!newsfound[i].link._id){ 
     newsarray.push(newsfound[i]) 
    } else { 
     var tempnew = newsfound[i]; 
     db.findOne('links',{'_id':tempnew.link._id},function(err,linkdetails){ 
      if(err){ 
       console.log(err) 
      } else { 
       tempnew.linkdetails = linkdetails; 
       newsarray.push(tempnew) 
      } 
     }) 
    } 
} 
console.log(newsarray) 

這樣做的結果是不含有消息的鏈接陣列或如果我嘗試一些變化與原始消息數組沒有添加的詳細信息。

+0

這是一個**異步環境**。這就是爲什麼你將回調傳遞給db.findOne()。 – Pointy

+0

你是什麼意思?我該怎麼辦?我嘗試了異步但仍然無法獲得修改的消息... – anges244

+1

爲什麼downvote?我顯然理解異步上下文,但沒有看到爲什麼array.push(modifiednew)失敗。你能解釋一下嗎? – anges244

回答

1

您不能在for循環中使用異步函數。原因是for循環在任何回調可能到來之前都會被執行,因此範圍會變得混亂。

您應該使用遞歸函數(自我調用),它會在上一次結束之前阻止下一次異步調用。

var i = 0; 
function fn() { 
    // your logic goes here, 
    // make an async function call or whatever. I have shown async in a timeout. 
    setTimeout(function() { 
     i += 1;  
     if (i < newsfound.length) { 
      fn(); 
     } else { 
      // done 
      // print result 
     } 
    }); 

} 

更新:

爲您的使用情況下,

var newsarray = [] 
var i = 0; 

function done() { 
    // done, use the result 
    console.log(newsarray); 
} 

function fn() { 
    if (!newsfound[i].link._id) { 
     newsarray.push(newsfound[i]); 
     i += 1; 
     if (i < newsfound.length) { 
      fn(); 
     } else { 
      done(); 
     } 
    } else { 
     var tempnew = newsfound[i]; 
     db.findOne('links', {'_id':tempnew.link._id}, function(err, linkdetails){ 
      if(err){ 
       console.log(err) 
      } else { 
       tempnew.linkdetails = linkdetails; 
       newsarray.push(tempnew); 
       i += 1; 
       if (i < newsfound.length) { 
        fn(); 
       } else { 
        done(); 
       } 
      } 
     }) 
    } 
} 
+0

感謝您的解釋。我想我得到了一般想法,但在這種情況下,我應該怎麼做?我的意思是我必須使用一個if ... else ...和一個db.query。我也必須使用同樣的技術嗎?你能解釋一些更具體的? – anges244

+0

實際上如果我不想打印結果但想將其推入數組中,該怎麼辦?這就是問題開始的地方...... – anges244

+1

@Aggelos看到更新後的答案,這是你想要的嗎? –