2012-09-25 2 views
1

다음은 Javascript로 작성된 for 루프입니다. 그것은 websql에 대한 쿼리를 적용하려고합니다.자바 스크립트의 for 루프에서 마지막으로 실행 한 작업 만

for (var i = 0; i < 10; i++){ 
    db.transaction(function (tx){ 
    tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]); 
    }); 
} 

시도는하기 표 I에 열 ProjSetsT ProjID에 값 "9 0, 1, 2, ..."를 추가하려고 명백하다. 작동하지 않습니다. 마지막 요소 인 '9'만 삽입되었지만 처음 8 개의 숫자는 삽입되지 않았습니다.

구문 오류가 있습니까?

+2

구문 실수가 크게 실행이 안될 수 있기 때문입니다 : 비동기 컨텍스트를 제공, i 당신은 클로저를 사용하여 문제를 해결할 수

을 호출된다 당신은 루프 내에서 작성하는 첫 번째 함수 전에 최대 크기에 도달 한 것입니다. .. WebSQL은 비동기 API이므로,이 방법으로 올바른 값을 캐치 할 수는 없습니다. [웹 SQL 데이터베이스 + 자바 스크립트 루프] (http://stackoverflow.com/questions/4825455/web-sql-database-javascript-loop)를 참조하십시오. 또한 하나의 트랜잭션에서 여러 쿼리를 실행하는 것이 더 빠르며 실제로 삽입 순서가 보장됩니다. 별도의 트랜잭션에서 각각을 실행하는 것은 임의의 순서로 모든 것을 느리게 수행 할 수 있습니다. – DCoder

+1

하나의 검색어를 입력하지 않으시겠습니까? 여기서 바인드 된 값은 for 루프의 값으로 작성된 문자열입니다. –

답변

4

나는 db.transaction가 비동기 적으로 실행되어 사용자를 망칠 수 있다고 생각합니다. 트랜잭션 내에서 for 루프를 이동하려고 시도 했습니까?

db.transaction(function (tx){ 
    for (var i = 0; i < 10; i++){ 
     tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]); 
    } 
}); 
+0

당신이 옳습니다. 그리고 다른 사람들의 조언이 모두 효과가 있지만 가장 직접적인 방법이라고 생각합니다. 그래서 내가 너를 답으로 쓴거야. –

1

당신은 10로 끝 같은 i 변수를 참조하는 여러 가지 기능을 가지고 있습니다.

각 기능마다 새로운 가변 범위가 필요합니다.

for (var i = 0; i < 10; i++){ 
    db.transaction(makeHandler(i)); 
} 

function makeHandler(j) { 
    return function (tx){ 
     tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [j]); 
    }; 
} 

이제 ij로 수신 makeHandler에 전달된다.

makeHandler이 호출 될 때마다 해당 로컬 j을 참조하는 함수를 반환합니다.

2

인수로 전달하는 모든 함수는 i과 동일한 참조를 공유하므로 모든 새 함수 객체의 i 값이 증가합니다.

for (var i = 0; i < 10; i++) 
{ 
    db.transaction((function(privateI) 
    {//privateI is unique for every function object 
     return function (tx) 
     { 
      tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [privateI]); 
     }; 
    })(i));//pass current value here 
}