gpt4 book ai didi

javascript - Nodejs、MySQL、异步迭代函数

转载 作者:行者123 更新时间:2023-11-29 11:50:12 24 4
gpt4 key购买 nike

我在使用 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;
}

});

}

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

谢谢!

编辑:这是我正在讨论的数据示例:

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 = ?

输入的示例 Node 列表:

[ { 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
},
{...}]
},
{...}]
},
{...}]

最佳答案

很难判断是否存在其他重大问题,因为我看不到您向该方法提供的数据。然而,这有一个主要问题:您试图 return来自使用异步方法调用的方法的数据。

异步方式是通过回调返回值。在您的代码中,最后一个 function在您的示例中(回调)是从完全不同的范围(从async框架内)调用的,因此您的nodeListerr正在迷失在您无法控制的范围内。

您需要重新考虑您的代码,以便将返回的数据传递给回调。您可以利用 async为此回调。将回调参数添加到您的 subNodeProc方法。然后你可以在async之后调用该回调。已完成,将 nodeList 传递给它:

var subNodeProc = function (nodeList, sqlP, itteration_count, cb) {

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)
throw err;
else
cb(nodeList);

});
}

然后您将使用如下方法:

subNodeProc(nodeList, sqlP, itteration_count, function (processed) {

console.log(processed);

/* do whatever you want afterwards here */

});

关于javascript - Nodejs、MySQL、异步迭代函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34223454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com