簡體   English   中英

在for循環內執行查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM