我在for循环中执行sql查询,执行查询的函数是异步操作。所以我将异步操作包装在一个立即调用函数中。
for(var k in bizValuesObj){
if( existingCountries.hasOwnProperty(bizValuesObj[k]["country"]) ){
country_id = existingCountries[bizValuesObj[k]["country"]];
}
var productName = bizValuesObj[k]["product"];
var bizTypes = bizValuesObj[k]["bizTypes"];
var getproductIdQuery = "SELECT `id` FROM `product` WHERE name = ? AND country_id = ?";
(function(){
connection.query(getproductIdQuery, [productName, country_id], function(err, result){
if(err){
console.error("Error getting product id:", err.stack);
}
product_id = result[0].id;
for(var j= 0; j < bizTypes.length; j++){
var temp = [];
temp.push(bizTypes[j]);
temp.push(country_id);
temp.push(product_id);
bizValues.push(temp);
}
});
})(k);
}
目前,我不确定为什么 bizValues 在主循环结束之前不会被填充。我正在尝试为k的每个值填充 bizValues 。
答案 0 :(得分:1)
您可以尝试更改此代码并使用promise.all docs
简而言之,Promise.all接受一系列promise并仅在获取所有异步数据时执行promise。 Promise.all的一个优点/缺点是在任何单个可迭代中遇到错误时调用catch块
for(var k in bizValuesObj){
if( existingCountries.hasOwnProperty(bizValuesObj[k]["country"]) ){
country_id = existingCountries[bizValuesObj[k]["country"]];
}
var productName = bizValuesObj[k]["product"];
var bizTypes = bizValuesObj[k]["bizTypes"];
var getproductIdQuery = "SELECT `id` FROM `product` WHERE name = ? AND country_id = ?";
// Async handling from here
const promiseArray = []
promiseArray.push(connection.query(getproductIdQuery, [productName, country_id])); // <- This function is a promise
}
Promise.all(promiseArray).then((response) => {
// your response after all async fetches
}).catch((error) => handle error)
现在,在成功处理程序中,您可以进一步处理数据。
答案 1 :(得分:0)
您的代码是异步的,它会在一段时间后填充。您应该尝试使用Promises来解决问题。您可以制作一系列承诺,然后并行/串行地调用它们中的每一个。我建议使用Promise.all()。但是你必须处理承诺失败的情况。请参阅下面的代码
function getPromise(getproductIdQuery){
return new Promise(function(resolve, reject){
connection.query(getproductIdQuery, [productName, country_id], function(err, result){
if(err){
console.error("Error getting product id:", err.stack);
reject(err);
}
product_id = result[0].id;
for(var j= 0; j < bizTypes.length; j++){
var temp = [];
temp.push(bizTypes[j]);
temp.push(country_id);
temp.push(product_id);
bizValues.push(temp);
}
resolve(true);
}
})
}
let promiseArray = [];
for(var k in bizValuesObj){
if( existingCountries.hasOwnProperty(bizValuesObj[k]["country"]) ){
country_id = existingCountries[bizValuesObj[k]["country"]];
}
var productName = bizValuesObj[k]["product"];
var bizTypes = bizValuesObj[k]["bizTypes"];
var getproductIdQuery = "SELECT `id` FROM `product` WHERE name = ? AND country_id = ?";
promiseArray.push(getPromise(getproductIdQuery));
}
Promise.all(promiseArray).then(function(){
// here you would find temp array populated
})