2011-06-27 46 views
0

我想在循環中包含的executeSql函數中使用循環變量。但是,如果我不使用閉包,循環變量會獲取最後一個值。當我使用閉包時,我沒有從executeSql函數中得到結果列表。示例:webkit executionql語句和循環問題

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); 
} 

有了這個,我得到了「我」的權利。但「結果」未定義。

我試圖通過 「TX」 和 「i」 是這樣的:

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

有了這個,我明白爲什麼我得到 「成果」 爲空。我想了解如何獲得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(tx,res)這顯然是整個(function(i){ return function(tx,res){ ... }; })(i)做什麼的功能,因爲外部匿名函數執行立即並返回該簽名的功能。

在內部函數的值i具有i值時外部函數被調用(即,每一次迭代的值),由於值i通過值傳遞到外部匿名功能,所以引用i在返回的內部函數將正確解析。

+0

謝謝大衛。這很有幫助。 – caranhithion

+0

不適合我。我發佈了我的問題http://stackoverflow.com/questions/19313901/query-in-loop-not-working-for-ios –