nodejs,mysql,异步功能

sn0r

我在Node.js中使用了功能性函数,遇到了一些麻烦。

我正在逐步检查一个对象,并检查该对象是否连接了任何子对象(想想:一颗星星有一颗行星有一颗月亮有一颗轨道站有一艘船)。

我正在尝试将所有这些组装成一个不错的对象数组,以推送到客户端。

功能如下:

        var subNodeProc = function(nodeList,sqlP,itteration_count) {
            var async = require('async');

            --itteration_count;
            async.each(nodeList,function(dd,cb){

                    var simple = {
                        sql:sqlP,
                        values:[dd.node_id],
                        timeout:40000
                    };

                    dd.subnodes = false;
                    connection.query(simple, function(err,rslt){
                        if (err) {
                            cb(err);
                        } else {
                            if (rslt.length > 0) {

                                var r = nodeList.indexOf(dd);
                                if (itteration_count > 0) {
                                    rslt = subNodeProc(rslt,sqlP,itteration_count);
                                }
                                nodeList[r].subnodes = rslt;

                            }
                            cb();
                        }
                    });

            },function(err){

                if (err) {
                    return err;
                } else {
                    return nodeList;
                }

            });

        }

当我触发该函数时,它将返回未定义的节点列表。谁能给我一个正确方向的指针?我无法正常工作

谢谢!

编辑:这是我要传递的数据的示例:

SQL语句:

SELECT n.id as node_id, n.name, n.system_id, n.parent_id as parent_id FROM nodes as n WHERE n.parent_id = ?

输入的样本nodeList:

[ { node_id: 1,
    name: 'Planet A',
    system_id: 1,
    parent_id: null,
},
{ node_id: 2,
    name: 'Moon',
    system_id: 1,
    parent_id: 1,
},
{ node_id: 3,
    name: 'Debris',
    system_id: 1,
    parent_id: 2,
},
{ node_id: 4,
    name: 'Asteroid',
    system_id: 1,
    parent_id: 1,
} ]

月亮A的parent_id为1,node_id为2,月亮A也有绕其绕行的飞船(A船,node_id:3,parent_id:2)。

我想要的是 :

[ { node_id: 1,
    name: 'Planet A',
    system_id: 1,
    parent_id: null,
    subnodes:[{
        node_id: 2,
        name: 'Moon A',
        system_id: 1,
        parent_id: 1,
        subnodes: [{
            node_id:3,
            name: 'Ship A',
            system_id:1,
            parent_id:2
        },
        {...}]
    },
    {...}]
},
{...}]
sn0r

好的,一旦我怀疑了,解决方案就很明显了。非常感谢@shennan让我前进。

关键是:

  1. 正如@shennan所提​​到的,您不使用退货,因为我们正在异步工作。这意味着回调

  1. 您必须为函数的每个部分触发回调。仅使用一个函数是不可能的,因此要获得返回的对象,您需要两个,每个对象执行原始函数的不同部分。

这是我想出的。希望有人可以看看并给我意见...

        // Main processing function. 
        var subNodeProc = function(nodeList,sqlP,itteration_count,cback) {
            var async = require('async');

            itteration_count--;
            async.each(nodeList,function(dd,cb){

                if (itteration_count > 0) {

                    // Trigger SQL Walker subNodeProcWalker with the necessary data (dd.node_id in this case, with a callback)
                    subNodeProcWalker(dd.node_id,sqlP,itteration_count,function(nl) {

                        // Hey look! the walker has done its business. Time to fill the subnode and tell async we're done with this array node.
                        dd.subnodes = nl;
                        cb();

                    });

                }

            },function(){

                // At the end of the run, return the nodelist intact.
                cback(nodeList);

            });

        }


        // SQL Walker with callback for subNodeProc
        var subNodeProcWalker = function(node_id,sqlP,itteration_count,cback){

            // assemble the object for the query and do the query
            var simple = {
                sql:sqlP,
                values:[node_id],
                timeout:40000
            };
            connection.query(simple, function(err,rslt){
                if (err) {

                    console.log('Error in Query');
                    console.log(simple);
                    console.log(err);
                    cback(false);

                } else {

                    // no error and a result? Quick! Trigger subNodeProc again
                    if (rslt.length > 0) {

                        subNodeProc(rslt,sqlP,itteration_count,function(nodePol) {

                            // Lookie lookie! A result from subNodeProc! There's life there! Quick! tell this function we're done!
                            cback(nodePol);
                        });

                    } else {

                        cback(false);

                    }

                }

            });
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章