SQL查询中的承诺逻辑可更新子数组值

时间:2018-07-13 00:52:24

标签: node.js q tedious

我有一个应用程序,该应用程序需要一个数组数组,并在启动时执行逻辑以更新子数组以供以后重用。子数组更新功能需要逻辑来检查两个单独的MSSQL数据库中的表,从其中一个数据库中返回数据,并根据该返回值更新一些值。我已经很接近了,但是我认为我对诺言逻辑的理解与我正在尝试的东西有点偏离。我使用Q来实现承诺,而使用Tedious来实现MSSQL库。这是有问题的代码:

var machine_config = { database: 'machine' ...}
var pallet_config = { database: 'pallet' ... }

var hosts = [
  ['127.0.0.1', 'id', 'type'],
  ['127.0.0.2', 'id', 'type']
];

hosts.forEach(function(host, i) {
  var promise_machine = Select_Machine(host[0]).then(function(m_id) {
    console.log(m_id[0][0].value);
    if (m_id[0][0].value === undefined) {
      console.log("Not machine, maybe pallet?");
    } else {
      host[1] = m_id[0][0].value;
      host[2] = "Machine";
    }
  });
  var promise_pallet = Select_Pallet(host[0]).then(function(m_id_pal) {
    if (m_id_pal[0][0].value === undefined) {
      console.log("Machine ID not found!");
    } else {
      host[1] = m_id_pal[0][0].value;
      host[2] = "Pallet";
    }
  });
});

function Select_Machine(m_IPaddr) {
  var result = [];
  var deferred = q.defer(); // init promise
  var connection = new Connection(machine_config);
  connection.on('connect', function(err) {
      var request = new Request( // set up request structure
        'SELECT m_id FROM dbo.Machine WHERE m_IPaddr = @m_IPaddr;',
        function(err, rowCount) {
          if (err) {
            console.log(err); // print error on console if anything happens
          }
          if (rowCount == "0") {
            console.log(m_IPaddr + " not found in Machines");
            result.push("0");
          }
          deferred.resolve(result); 
        });
      request.on('row', function(columns) 
        result.push(columns);
      });
      request.addParameter('m_IPaddr', TYPES.NVarChar, m_IPaddr);
      connection.execSql(request);
    }
  );
  return deferred.promise;
}

function Select_Pallet(m_IPaddr) {
  var result = [];
  var deferred = q.defer(); // init promise
  var connection = new Connection(pallet_config);
  connection.on('connect', function(err) {
      var request = new Request( // set up request structure
        'SELECT m_id FROM dbo.Machine WHERE m_IPaddr = @m_IPaddr;',
        function(err, rowCount) {
          if (err) {
            console.log(err); // print error on console if anything happens
          }
          if (rowCount == "0") {
            console.log(m_IPaddr + " not found in Pallet");
            result.push("0");
          }
          deferred.resolve(result); 
        });
      request.on('row', function(columns) 
        result.push(columns);
      });
      request.addParameter('m_IPaddr', TYPES.NVarChar, m_IPaddr);
      connection.execSql(request);
    }
  );
  return deferred.promise;
}

预期的流程是遍历forEach语句中的每个子数组,首先检查Machine数据库以查看是否返回了任何结果。结果只能为0或1,如果有结果,则该主机的“ id”占位符将替换为与所选行的IP地址相对应的序列号。这样可行。如果没有返回结果,我想检查托盘数据库并更新子数组中的“ id”。如果两个都找不到匹配项,我们可以离开占位符。

我观察到的行为是,如果机器数据库中存在匹配项,则子数组值将更新,以后我可以使用它。如果托盘中只有一个匹配项,则永远不会更新该值。我可以在我的promise查询或forEach函数中进行一些调整以使其更可靠吗?谢谢!

1 个答案:

答案 0 :(得分:0)

hosts.forEach(function(host, i){
  var promise_machine = Select_Machine(host[0]).then(function(m_id) {
    if (m_id[0][0].value === undefined) {
      console.log("ID not defined, try pallet.");
      var promise_pallet = Select_Pallet(host[0]).then(function(m_id_pal) {
        if (m_id_pal[0][0].value === undefined) {
                 console.log("Machine ID not found!");
        }
        else {
          host[1] = m_id_pal[0][0].value;
          host[2] = "Pallet";
        }
    });
   }
   else {
     host[1] = m_id[0][0].value;
     host[2] = "Machine";
   }
    });
});

似乎可以解决我遇到的问题。