使用节点和mongoose将新的mongoDB文档从数组中取出的最好方法是什么?

我正在使用MeanJS,用户input每个需要创build一个新文档的对象列表。 同时,我需要创build另一个单独的文档,指向数组中的每个对象,并将每个对象链接回这个新文档。 所以最终的结果需要是模型“Q”的任意数量的文档,它们与模型“S”的另一个文档相关联。

我试图这样做的原因是让用户创build一个问题的调查。 每个问题都将是自己填写“调查”的对象(作为一个属性,将包含这些问题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")} 

我的问题:我似乎无法做到这一点没有遇到callback的问题。 有人可以给我一些build议吗? 这就是现在的样子:

客户端:

 $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); 

然后我有服务器端控制器来处理这些function。 questions.fillsurvey函数将问题添加到MongoDB中,然后将每个问题的id推送到Qids下的S文档中。 大部分工作正常,但是当客户端发送Q1,Q2,Q3和Q4时,服务器仅仅接收Q4四次。

理想情况下,我想发送$scope.Qlist$scope.S在一个发布请求,并让服务器端数字全部出来,但我不断被捕获的callback函数,这就是为什么我反而select在客户端通过$scope.Qlist循环post。 如果有人有一个“最佳实践”的解决scheme,我真的很感激帮助!

req_obj :您需要在for循环中定义req_obj

长答案:JavaScript依赖于所谓的闭包来处理variables作用域。 JavaScript也是一种asynchronous语言。 这意味着在JS中,您的for循环将不会等待$ http.post完成,然后继续。

通过将req_obj放在for循环之外,JS的asynchronous部分在第一个$ http完成准备和触发之前,修改了req_obj.Q 4次。 将req_obj移到for循环中将其从上面的闭包中取出,并将其放到for循环的闭包中,这与匿名函数类似。