2

重複の可能性:
javascript: function() { } 内で現在の for ループ カウンター値を使用していますか?

以下のコードを実行すると、2 番目のコンソール ログ出力は、最初のコンソール ログ出力の最後の行を繰り返すだけです。

これは、ネストされたすべてのクエリ 2 が、他のすべてが完了した後に実行するためにキューに入れられているためです。また、関数内に関数があるため、これは「クロージャー」を作成します。これは、ネストされたクエリ 2 の変数セットが 1 つしかないことを意味し、使用されるのはこれらの最終状態であるため、最後のクエリ 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 を say に置き換え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']);
    }
}

ありがとう@ジェームズ

于 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 に答える