2011-06-27 4 views
0

私はループで格納されたexecuteSql関数でループ変数を使用しようとしています。しかし、私はクロージャを使用しない場合、ループ変数は最後の値を取得します。私がクロージャを使用すると、私はexecuteSql関数から結果リストを取得しません。例:Webkit executeql文とループの問題

for (var i = 0; i < count; i++) { 
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [], 
function(tx,results) //success function 
{ 
//do something 
} 
,errorfunction); 

} 

成功関数 "i"は常に "count + 1"です。私はこのように私のコードを変更し、これを解決するために

:これにより

for (var i = 0; i < count; i++) { 
tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [], 
(function(tx,results) //success function 
{ 
//do something 
})(i) 
,errorfunction); 
} 

、私は "i" の権利を取得します。しかし、 "結果"は未定義です。私は「結果」はnullとして取得する理由を私は理解してこれにより

(function(tx,results) //success function 
    { 
    //do something 
    })(tx,null,i) 

は、私が「私」は、このような「TX」とを渡そうとしました。私はexecuteSqlの正しい結果をどうやって得ることができるかを知りたい。

答えて

2

次を探している:一日の終わりに

for (var i = 0; i < count; i++) { 
    tx.executeSql('SELECT AColumn FROM ATable WHERE refID=' + i, [], 
     (function(i){ 
     return function(tx,results) //success function 
     { 
      //do something 
     }; 
     })(i), 
    errorfunction); 
} 

あなたは外側の無名関数を実行するので、その全体(function(i){ return function(tx,res){ ... }; })(i)が何をするか明確で署名function(tx,res)の機能を渡す必要があります直ちにその署名の関数を返す。 i

その内部関数の値iiが外側匿名関数に値によって渡されるので、外側の関数は、(すなわち、各反復の値)と呼ばれたiの値を持っているので、参考に返された内部関数は正しく解決されます。

+0

ありがとうございました。これは役に立ちます。 – caranhithion

+0

私のために働いていない。私は私の質問を投稿しましたhttp://stackoverflow.com/questions/19313901/query-in-loop-not-working-for-ios –

関連する問題