2015-01-17 3 views
3

루프를 통과하여 증가하는 SQL 문마다 db.transaction을 호출해야하는 배열에 함수를 전달하려고합니다. 내가있을 때 테스트 나는이Javascript SQL Insert Loop

['one', 'two', 'three', 'four'] 

하지만 같은 배열에 통과하는 updateColorData 함수를 호출하고 있습니다로

function updateColorData (colorArray) { 
    for (var i=0; i<colorArray.length; i++) { 
     var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')'; 
     if (i < colorArray.length-1) { 
      db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB); 
     } else { 
      db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB); 
     } 
    } 
} 

데이터베이스 내가

['four', 'four', 'four', 'four'] 
받고 있어요는받은 정보를 다시 읽어

이렇게 루프에서 4 개의 데이터베이스 트랜잭션을 호출하는 것이 가장 효율적인 방법은 아니지만 왜 이것이 작동하지 않는지 또는 다른 방법을 시도해야하는지 잘 모르겠습니다.

감사합니다.

+0

클라이언트 측에서 쿼리를 실행하는 데 사용중인 라이브러리를 설명 할 수 있습니까? – Mouser

+0

저는 Codova 프레임 워크와 함께 SQLite를 사용하여 iOS 용으로 개발하고 있습니다. 그것은 필요한 정보입니까? – CountingStacks

+0

[JavaScript 클로저는 어떻게 작동합니까?] (http://stackoverflow.com/a/111111/402037) + [Mom Exploits] (http://xkcd.com/327/) (일컬어 : [SQL 주입] (http://en.wikipedia.org/wiki/SQL_injection) – Andreas

답변

3

데이터베이스 기능을 호출하기 전에 i의 새 범위를 만들어야합니다. 이 시도 : 익명 함수를 사용 i의 각 값에 대한 개별 기능 범위를 생성

function updateColorData (colorArray) { 
    for (var i=0; i<colorArray.length; i++) { 
     (function(i){ 
      var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')'; 
      if (i < colorArray.length-1) { 
       db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB); 
      } else { 
      db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB); 
      } 
     })(i); 
    } 
} 

한다. 원래 예제의 for 루프가 데이터베이스 기능이 반환 될 때까지 기다리지 않고 i을 계속 업데이트하므로이 작업이 필요합니다. 따라서 for 루프가 i 값을 변경하지 않고 데이터베이스 기능을 실행하기위한 "안전한"컨텍스트를 만들어야하며, 이는 익명의 함수가 제공하는 것과 정확히 같습니다.

+0

왜 이것이 작동하고 게시 된 예제가 설명하지 않을 수 있습니까? – Mouser

+0

더 깊이 설명하려고했습니다. – celeritas

+0

감사합니다. DB 호출의 비동기 특성에 대해 생각하지 않았습니다. 좋은!!! – Mouser