1

我有一个关于 node.js / javascript 语法和异步调用的初学者问题。我正在使用 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
            }
        });
    }
});

显而易见,我的结果和错误变量发生冲突。有人可以解释解决这个异步函数的语法吗?

谢谢!

4

2 回答 2

2

给每个变量一个特定于该函数的名称:

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);

但是这种重构是即兴的——它可能不适合你的情况。

问题应该通过第一段代码来解决

于 2013-05-16T02:15:09.810 回答
1

按照 Squadrons 的建议,将错误和结果重命名为 errZone,resultZone /errClient,resultClient,或者使用异步https://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
            }
        }
    });
于 2013-05-16T07:24:20.063 回答