2015-07-03 22 views
1

我使用MeanJS,用戶輸入每個需要創建新文檔的對象列表。同時我需要創建另一個單獨的文檔,指向數組中的每個對象,並將每個對象鏈接回這個新文檔。所以最終的結果需要是模型'Q'的任意數量的文檔,它們與模型'S'的另一個文檔相關聯。使用節點和貓鼬將新mongoDB文檔從數組中取出的最佳方式是什麼?

我試圖做到這一點的原因是讓用戶創建一個問題的調查。每個問題都將是它自己的填充調查的對象(作爲一個屬性,它將包含這些問題ID的列表)。

S = {"_id": 0, "Qids": [ObjectId("1"), ObjectId("2"), ObjectId("3"), ObjectId("4")]} 
Q1 = {"_id": ObjectId("1"), "Sid": ObjectId("0")} 
Q2 = {"_id": ObjectId("2"), "Sid": ObjectId("0")} 
Q3 = {"_id": ObjectId("3"), "Sid": ObjectId("0")} 
Q4 = {"_id": ObjectId("4"), "Sid": ObjectId("0")} 

我的問題:我似乎無法做到這一點,而不會在某種問題回調。有人能給我一些建議嗎?這是它看起來像現在:

客戶端:

$scope.Qlist = [Q1, Q2, Q3, Q4]; 
$scope.S = {}; 
$http.post('/S', $scope.S).success(function(data){ 
    var req_obj = { 
     Sid: data._id, 
     Q: {} 
    }; 
    for (var i = 0; i<$scope.Qlist.length; i++) { 
     req_obj.Q = $scope.Qlist[i]; 
     $http.post('/Q', req_obj); 
    }; 
}); 

服務器端:

app.route('/Q') 
    .post(users.requiresLogin, questions.hasAuthorization, questions.fillSurvey); 

然後,我有處理這些功能的服務器端控制器。 questions.fillsurvey函數將問題添加到MongoDB,然後獲取每個問題的ID並將它們推送到Qids下的S文檔中。大部分工作正常,但當客戶端發送Q1,Q2,Q3和Q4時,服務器僅接收4次Q4。

理想情況下,我想發送$scope.Qlist$scope.S在一個發佈請求中,並讓服務器端數據全部出來,但我一直被捕獲的回調函數,這就是爲什麼我選擇了在客戶端循環通過$scope.Qlist的帖子。如果有人有「最佳實踐」解決方案,我非常感謝幫助!

回答

1

簡答:您需要在for循環內定義req_obj

Long答案:JavaScript依賴於所謂的閉包來處理變量範圍。 JavaScript也是一種異步語言。這意味着在JS中,您的for循環將不會等待$ http.post完成,然後繼續。

通過將req_obj放在for循環之外,JS的異步部分在第一個$ http完成準備和觸發之前修改了req_obj.Q 4次。將req_obj移入for循環將其從上面的閉包中移出,並將其放入for循環的閉包中,這與匿名函數類似。

+0

謝謝!這工作! – AStack41

相關問題