2012-03-08 17 views
0

以下のクエリでは、forループが4つの値を実行しています。最初の警告(id)では、これらの4つの異なる値を警告しています。ただし、ネストされたクエリでは、アラート文では最後のid値のみが出力され、4xではmax(b.id)の値が異なります。よくわかりません。誰が何が起きているのか知っていますか?競合状態が発生している可能性がありますか?Forループ後にネストされたHTML5 Web SQLクエリが処理された

私の目標は、idとb.idの両方に基づいて入力値を持つネストされたクエリにAjax呼び出しを配置することです。私は現在これをやっていますが、 "id"のajax呼び出しの値は、4つの異なる呼び出しすべてで同じです。戻り値のデータが混乱します。ありがとう。

database.db.transaction(function (tx) { 
      tx.executeSql('SELECT id, name from programs d', [], function (tx, results) { 
       for (var i = 0; i < results.rows.length; i++) { 
        var id = results.rows.item(i)['id']; 
        var name = results.rows.item(i)['name']; 
         alert(id); 

        tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?', 
         [id], 
         function (tx, results) { 
          lastRecord = results.rows.item(0)['max']; 
          alert(id + "last rec: " + name); 
         } 
        ); 
       } 
      }, 
      function (event) { alert(event.message); }); 
+0

あなたは明確になりますか? 2番目の 'tx.executeSql'で使われる' [id] 'が常に最初のクエリの結果セットの最後のものであるという問題はありますか? –

+0

ええ、それは起こっている: 私の問題は、最初のネストされたクエリtx.executeSql( 'SELECT max ...')のクエリが正しく実行されているということです。しかしその下のアラートの範囲では、警告(id + "last rec:" + name) は最後の要素としてのみ表示されます。 – Garrett

+0

これは、最初のネストされたクエリーでネストされたAjax呼び出しが3/4のケースで失敗する原因となります。 – Garrett

答えて

2

私のコメントとして、パラメータを正しくバインドする閉じた関数を返すようにしました。

はるかに簡単例えば以下の通りである

は、これはすべての4を示し、4アラートを生成し実行する:

for (i=0;i<4;i++) { 
    setTimeout(function() { alert(i)}, 1000); 
} 

これは0/4、1/4を示し、4アラートを生成し実行すると、2/4,3/4。私が命名しました

for (i=0;i<4;i++) { 
    setTimeout(function(inneri) { 
     return( 
      function() { 
       alert(inneri + "/" + i); 
      } 
     ); 
    }(i), 1000); 
} 

inneri閉鎖時に保存した値。私自身が依然として外側スコープを参照しているので、実行時にはtrueであることに注意してください。これは、forループからダンプするときの値です。実行は

。最初のケースは、2番目のケースをしたいのに対し、何をやっているの簡単なバージョンである

setTimeout()を使用して、あなたのJSを書き換え(と私はすべてのこれらの(および{ 'sのを得ることを望ん右の場所:))を与える:

私が挿入されている
database.db.transaction(function (tx) { 
     tx.executeSql('SELECT id, name from programs d', [], function (tx, results) { 
      for (var i = 0; i < results.rows.length; i++) { 
       var id = results.rows.item(i)['id']; 
       var name = results.rows.item(i)['name']; 
       alert(id); 

       tx.executeSql('SELECT max(b.id) + 1 max from people b where b.sid = ?', 
        [id], 
        function(innerId) { 
         return (
          function (tx, results) { 
           lastRecord = results.rows.item(0)['max']; 
           alert(innerId + "last rec: " + name); 
          } 
         ); 
        }(id) //be careful to avoid the ";" here! 
       ); 
      } 
     }, 
     function (event) { alert(event.message); 
    }); 

function(innerId) { 
    return (
     function (tx, results) { 
      lastRecord = results.rows.item(0)['max']; 
      alert(innerId + "last rec: " + name); 
     } 
    ); 
}(id) 

inこの関数は、(id)を介してすぐに呼び出され、txresultsを引数とし、適切な処理を行う関数を返します。

私は中かっこをチェックしましたが、誤植をしていないことを直接確認する方法はありません。

関連する問題