[英]Executing an query inside a for loop
我正在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 。
您可以嘗試更改此代碼並使用promise.all 文檔
簡而言之,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)
現在,在成功處理程序中,您可以進一步處理數據。
您的代碼是異步的,將在一段時間后填充它。 您應該嘗試使用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
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.