在for循环中执行查询

时间:2017-08-27 18:56:53

标签: javascript mysql node.js

我在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

2 个答案:

答案 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
})