我有一个应用程序,该应用程序需要一个数组数组,并在启动时执行逻辑以更新子数组以供以后重用。子数组更新功能需要逻辑来检查两个单独的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函数中进行一些调整以使其更可靠吗?谢谢!
答案 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";
}
});
});
似乎可以解决我遇到的问题。