Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析NodeJS中对象数组的递归函数_Javascript_Node.js_Mongodb_Recursion - Fatal编程技术网

Javascript 解析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")

我有这样一个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") {
                    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();
};