2013-05-16 42 views
1

我有一個關於node.js/javascript語法和異步調用的初學者問題。我正在使用node-dbi從MySQL服務器中提取一些信息。node js:使用相同的參數名在另一個函數內執行一個函數

我有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 
    } 
} 

下面是我的節點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 
      } 
     }); 
    } 
}); 

由於這是顯而易見,我的成績和犯錯變量發生衝突..有人可以解釋一下解決這個異步函數的語法嗎?

謝謝!

回答

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

但是,重構是即興 - 它可能不適合你的情況。

的問題應該由第一段代碼

+0

完美!正是我需要的。謝謝! – unicornherder

1

要麼重新命名犯錯,從而導致成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 
      } 
     } 
    }); 
相關問題