3

いくつかのアイテムを含むリストと、リスト内の各アイテムがデータベースにあるかどうかを確認するループがあります(見つからない場合は挿入します)。

function AddItems(tx)
    {
        for(var i = 0 ; i<itemscounter; i++)
        { 
            itemI=itemsList[i]; 
            tx.executeSql('SELECT * FROM Items Where ItemsTable.ItemId="'+itemI+'"', [], AddItemsToDB, errorCB);
        }
    }

問題は、関数がすべての反復を終了するまで待機してから sqlite ステートメントを実行するため、itemI値が常に itemsList[itemscounter] と等しくなることです。そのため、AddItemsToDB の「アイテム カウンター」の回数を入力しますが、常に同じ値 (配列の最後の値) を使用します。

これは成功関数です:

function AddItemsToDB(tx, results)
{
        var len = results.rows.length;
        alert(itemI); // Always has the same value!
        if(len==0)
        {
            tx.executeSql('INSERT INTO ItemsTable (ItemId) VALUES ('+itemI +')');


        }
}

それで、成功関数自体でパラメーターを渡す方法があるかどうか、またはアイテムを1つずつ渡す別の方法があるかどうか疑問に思っていますか?

4

1 に答える 1

3

はい、あります。次のようにしてみてください。

tx.executeSql('SELECT * FROM Items Where ItemsTable.ItemId="'+itemI+'"', [], 
       (function(itemI){
           return function(tx,results){
               AddItemsToDB(tx,results,itemI);
           };
       })(itemI), errorCB);

AddItemsToDB次のように変更します。

function AddItemsToDB(tx, results, itemI) {
于 2012-07-17T13:13:49.147 に答える