节点js:使用相同的参数名称在另一个函数内执行一个函数

我有一个关于node.js / javascript语法和asynchronous调用的初学者问题。 我正在使用node-dbi从MySQL服务器中提取一些信息。

我有2桌子。 客户端区域

我需要写一个这样的函数:

for (i=0;<zone.count;i++){ for (j=0;j<client.count;j++){ //loop through the entire client table for each zone record & run a condition } } 

这是我在node-dbi中的语法:

 db.fetchAll('SELECT * from Zone', null, function(err, result){ if (result) { db.fetchAll('SELECT * from Client', null, function(err, result){ if (result) { //do something to all client records for each zone record } }); } }); 

由于这是显而易见的,我的结果和errvariables是冲突..有人可以请解释语法来解决这个asynchronousfunction?

谢谢!

为每个variables指定一个特定于该函数的名称:

 db.fetchAll('SELECT * from Zone', null, function(zoneErr, zoneResult){ if (zoneResult) { db.fetchAll('SELECT * from Client', null, function(clientErr, clientResult){ if (clientResult) { //do something to all client records for each zone record } }); } }); 

此外,你应该重构一下,使其更具可读性,并删除深层嵌套。

这是一个想法的方法:

 var getZones = function() { var result; db.fetchAll('SELECT * from Zone', null, function(zoneErr, zoneResult){ if (zoneResult) { callback(); result = true; // assumes you need to keep track of success of failure of result } else { result = false; } } return result; }; var getClients { ... same code as above for clients }; getZones(getClients); 

但那个重构不在袖口,可能不适合你的情况。

这个问题应该由第一段代码解决

将err和结果重命名为errZone,resultZone / errClient,resultClient作为Squadronsbuild议,或使用asynchronoushttps://npmjs.org/package/async

 // WARNING UNTESTED CODE // npm install async // or add async into your package.json dependencies var async = require('async'); async.parallel({ zone: function (callback) { db.fetchAll('SELECT * from Zone', null, function (err, result) { if (err || !result) { callback(err || 'No Zone results found', result) } }); }, client: function (callback) { db.fetchAll('SELECT * from Client', null, function (err, result) { if (err || !result) { callback(err || 'No Client results found', result) } }); } }, function (err, results) { if (err) throw err; for (var i = 0; i < results.zone.count; i++) { for (var j = 0; j < results.client.count; j++) { //loop through the entire client table for each zone record & run a condition } } });