2

可能重复:
javascript:在函数(){}中使用当前的for循环计数器值?

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

我理解这是因为所有嵌套的查询 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);

});
First console log output
select * from ProductDescriptions where bsrt56 = 1.00
select * from ProductDescriptions where bsrt56 = 2.00
select * from ProductDescriptions where bsrt56 = 2.50
select * from ProductDescriptions where bsrt56 = 3.00
select * from ProductDescriptions where bsrt56 = 4.00

Second console log output
select * from ProductDescriptions where bsrt56 = 4.00 
select * from ProductDescriptions where bsrt56 = 4.00 
select * from ProductDescriptions where bsrt56 = 4.00 
select * from ProductDescriptions where bsrt56 = 4.00 
select * from ProductDescriptions where bsrt56 = 4.00
4

2 回答 2

1

是的,这可行,如果您console.log(productDescriptionSQL);在查询 2 中替换为 sayloopdloop(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']);
    }
}

谢谢@詹姆斯

于 2012-10-11T15:26:29.247 回答
0

尝试改变:

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

至:

var lineData = listResults.rows[i].item[0];
于 2012-10-10T16:36:58.113 回答