Javascript 相同嵌套查询

Javascript 相同嵌套查询,javascript,sql,closures,nested,Javascript,Sql,Closures,Nested,可能重复: 如果我运行下面的代码,第二个控制台日志输出只会重复第一个控制台日志输出的最后一行 我理解这是因为所有嵌套查询2都排队等待在其他所有操作完成后运行。同样,由于我们在函数中有一个函数,这会创建一个“闭包”,这意味着嵌套查询2只有一组变量,并且使用的是这些变量的最终状态,因此只有上一个查询1的结果会重复用于查询2。至少我认为这是正在发生的事情。问题是,我怎样才能改变它,使整个事情按顺序进行 谢谢 db.transaction(function(tx){ // Query 1

可能重复:

如果我运行下面的代码,第二个控制台日志输出只会重复第一个控制台日志输出的最后一行

我理解这是因为所有嵌套查询2都排队等待在其他所有操作完成后运行。同样,由于我们在函数中有一个函数,这会创建一个“闭包”,这意味着嵌套查询2只有一组变量,并且使用的是这些变量的最终状态,因此只有上一个查询1的结果会重复用于查询2。至少我认为这是正在发生的事情。问题是,我怎样才能改变它,使整个事情按顺序进行

谢谢

db.transaction(function(tx){

    //  Query 1                 
    tx.executeSql("SELECT * FROM Products GROUP BY ssrt55", [], function(tx, listResults){
        for (var i = 0; i < listResults.rows.length; i++) {
            var lineData = listResults.rows.item(i);
            var productDescriptionSQL = "select * from ProductDescriptions where bsrt56 = " + lineData['SSRT55'];
            console.log(productDescriptionSQL);

            //  Query 2
            tx.executeSql(productDescriptionSQL, [], function(tx, descriptionResults){
                console.log(productDescriptionSQL);                         
            }, onError);    

        }
    }, onError);

});
尝试更改:

var lineData = listResults.rows.item(i);
致:


是的,如果您替换
console.log(productDescriptionSQL),则此操作有效loopdloop(tx,listResults)
进行编码>以便创建新变量,所有处理都可以在该函数中进行,并且当所有查询在最后一起运行时不会被覆盖

db.transaction(function(tx){

    tx.executeSql("SELECT * FROM Products GROUP BY ssrt55", [], function(tx, listResults){
        for (var i = 0; i < listResults.rows.length; i++) {
            var lineData = listResults.rows.item(i);
            //var lineData = listResults.rows[i].item[0];
            var productDescriptionSQL = "select * from HierarchyDescriptions where psrt56 = '" + lineData['SSRT55']+"'";
            console.log(productDescriptionSQL);

            tx.executeSql(productDescriptionSQL, [], function(tx, listResults){
                loopdloop(tx, listResults)
            }, onError);    

        }
    }, onError);

});

function loopdloop(tx, descResults){
    console.log(descResults.rows.length);
    for (var i = 0; i < descResults.rows.length; i++) {
        var descriptionData = descResults.rows.item(i);
        console.log(descriptionData['HDES56']);
    }
}
db.事务(功能(tx){
tx.executeSql(“通过ssrt55从产品组中选择*”,[],函数(tx,listResults){
对于(var i=0;i

谢谢@James

var lineData=listResults.rows[i]。项[0]不起作用,它返回未定义。我返回了正确的行,因此我认为
var lineData=listResults.rows.item(I)可以,除非我遗漏了什么。
var lineData = listResults.rows[i].item[0];
db.transaction(function(tx){

    tx.executeSql("SELECT * FROM Products GROUP BY ssrt55", [], function(tx, listResults){
        for (var i = 0; i < listResults.rows.length; i++) {
            var lineData = listResults.rows.item(i);
            //var lineData = listResults.rows[i].item[0];
            var productDescriptionSQL = "select * from HierarchyDescriptions where psrt56 = '" + lineData['SSRT55']+"'";
            console.log(productDescriptionSQL);

            tx.executeSql(productDescriptionSQL, [], function(tx, listResults){
                loopdloop(tx, listResults)
            }, onError);    

        }
    }, onError);

});

function loopdloop(tx, descResults){
    console.log(descResults.rows.length);
    for (var i = 0; i < descResults.rows.length; i++) {
        var descriptionData = descResults.rows.item(i);
        console.log(descriptionData['HDES56']);
    }
}