Javascript 解析NodeJS中对象数组的递归函数
我有这样一个NodeJS控制器:Javascript 解析NodeJS中对象数组的递归函数,javascript,node.js,mongodb,recursion,Javascript,Node.js,Mongodb,Recursion,我有这样一个NodeJS控制器: var importOrders = function (req, res, next) { var orders = req.body; var processOrder = function (order) { if(i<orders.length-1){ try { if (orders[i].Order.Company === "Mondial")
var importOrders = function (req, res, next) {
var orders = req.body;
var processOrder = function (order) {
if(i<orders.length-1){
try {
if (orders[i].Order.Company === "Mondial") {
parseMondial(db, orders[i].Order, processOrder(orders[i++]), log);
}
} catch (error) {
next(error);
log.error('orders', 'error Importing', error, order);
}
}
};
var i = 0;
processOrder(orders[i]);
res.send(orders.length);
};
在parseMondial中,我在mongoDB中使用承诺进行了很多查询,但这会查询它们之间的关系
这不起作用,因为我需要在parseMondial中完成下一个对象解析的过程,但并不等待。
我不知道该怎么做……有什么帮助就好了。我在plunkr中加入了一些javascript来模拟它的样子。只需打开控制台并运行代码。您应该看到它正在浏览并返回Mondial订单的数据 parseMondial中的代码完成后,可以调用回调,如果需要,可以传递数据。但是,它可能没有对parseMondial中的i或orders的引用,因此为了安全起见,我在parseMondial之外处理了传递订单和迭代索引的操作 传入processOrders不是回调。传递processOrders将其作为一个函数提供,可以在parseMondial结束时调用该函数 我去掉了一些try/catch的东西,只是为了使代码更易于阅读和使用 最后我做到了:
var importOrders = function (req, res, next) {
var orders = req.body;
var i = 0;
var doNext = function () {
i++;
processOrder();
};
var processOrder = function () {
if (i < orders.length) {
try {
if (orders[i].Order.Company === "Mondial") {
parseMondial(db, orders[i], doNext, log);
}
} catch (error) {
next(error);
log.error('orders', 'error Importing', error, orders[i].Order);
}
}else{
res.send({total:i});
}
};
processOrder();
};
在parseMondial内部,当我完成所有任务时,我会返回calback 你需要使用回调。我想我在使用回调,不是吗?parseMondial似乎没有,processOrder和res.send需要在回调中。我为parseMondial传递回调。这不对吗?@colymore就像Josh说的那样,res.send和processOrder需要等待到结束,或者在结束时将它们作为最终回调传递。节点将遍历并运行循环。当所有这些查询都以异步方式进行时,节点将继续并将循环留给processOrderorders[i]和res.send。调用res.send后,您将无法再修改响应,因为它已发出。我不确定您的数据是如何设置的,但如果订单.Company!==Mondial它不会进入下一个订单。不过,这可能是我唯一看到的潜在问题。不过很高兴你找到了答案。
var importOrders = function (req, res, next) {
var orders = req.body;
var i = 0;
var doNext = function () {
i++;
processOrder();
};
var processOrder = function () {
if (i < orders.length) {
try {
if (orders[i].Order.Company === "Mondial") {
parseMondial(db, orders[i], doNext, log);
}
} catch (error) {
next(error);
log.error('orders', 'error Importing', error, orders[i].Order);
}
}else{
res.send({total:i});
}
};
processOrder();
};