2014-11-02 34 views
0

我想通過使用該數組中每個對象的「TimeStamp」值來遍歷數組,以從本地數據庫返回關聯值。如果我簡單地使用myArray [0],那麼下面的代碼完美地適用於單次迭代,但只要我嘗試將它變成循環,它就不起作用。我知道循環中的函數有一些特殊之處,但不知道工作/修復是什麼。使用數組中的值循環遍歷本地數據庫,循環內的函數

for(var x = 0; x < myArray.length; x++) { 

    tx.executeSql("SELECT * FROM table WHERE entryreference = '"+myArray[x].TimeStamp+"' ", [], function(tx,results){ 

      var tempArray = []; 
      var len = results.rows.length; 
      for (var i = 0; i < len; i++){ 

      var tempObject = { 
      "Value": results.rows.item(i).value 
      } 

      tempArray.push(tempObject); 

      } 

      myArray[x].embeddedArray = tempArray; 


      }); 

     }; 
+0

你能測試我的答案,並發表評論說,如果它的工作與否?謝謝.. – 2014-11-02 15:24:32

回答

1

給每個迭代循環中的代碼一個臨時範圍。以前,問題出在x的值上。 x = myArray.length-1的同樣的mysql查詢正在執行myArray.length時間。我認爲它的固定與此...

for(var x = 0; x < myArray.length; x++) { 

    (function(x){ 
     tx.executeSql("SELECT * FROM table WHERE entry reference = '"+myArray[x].TimeStamp+"' ", [], function(tx,results){ 

     var tempArray = []; 
     var len = results.rows.length; 
     for (var i = 0; i < len; i++){ 

     var tempObject = { 
     "Value": results.rows.item(i).value 
     } 

     tempArray.push(tempObject); 

     } 

     myArray[x].embeddedArray = tempArray; 


     }); 
    })(x); 
    }; 
+1

你改變了什麼? – 2014-11-02 15:04:46

+0

@Jared,我給每個迭代循環內的代碼一個臨時範圍。以前,問題出在x的值上。 x = myArray.length-1的同樣的mysql查詢正在執行myArray.length時間。我認爲這是固定的...我做錯了嗎? – 2014-11-02 15:13:55

+1

似乎很好地工作,任何人都可以在這裏解釋倒票嗎? – OliverJ90 2014-11-02 15:32:24

0

的問題是變量「X」是由循環創建的所有回調函數共享,並且由當時的回調實際上是調用的「值x「將比數組的長度大一個。要解決這個問題,你必須封裝與另一函數的回調函數的構造,使每個回調具有對「嵌入」數組的引用就可以了:

function makeCallback(target) { 
    return function(tx, results) { 

     var tempArray = []; 
     var len = results.rows.length; 
     for (var i = 0; i < len; i++) { 

      var tempObject = { 
       "Value": results.rows.item(i).value 
      } 

      tempArray.push(tempObject); 
     } 
     target.embeddedArray = tempArray; 
    }; 
} 

for (var x = 0; x < myArray.length; x++) { 
    tx.executeSql("SELECT * FROM table WHERE entryreference = '" + myArray[x].TimeStamp + "' ", [], 
     makeCallback(myArray[x])); 
}; 

每個回調得到一個參考到要用查詢結果更新的「myArray」的元素。這個「目標」參數對於每個回調都是不同的。

+0

下面的答案與反對似乎工作,你知道爲什麼嗎? – OliverJ90 2014-11-02 16:13:54

+0

@ OliverJ90它的工作原理與我的答案基本相同。 – Pointy 2014-11-02 16:20:19

1

即使您成功地更正了您的代碼,由於您正在爲myArray中的每個值運行SQL查詢,因此效率非常低。

你要做的這兩個步驟:

  1. 通過迭代,可能使用IN條件建立查詢的WHERE部分。

  2. 執行和處理您的查詢。

+1

這是一個很好的觀點。 – Pointy 2014-11-02 15:07:21