2012-07-28 3 views
0

for 루프의 첫 번째 (및 유일한) 실행시 값을 주석 처리했습니다. connection.query my for 루프 뒤에는 항상 루프를 벗어나는 값이 주어집니다. 이유는 모르겠다. 더 많은 예제를 제공 할 수 있습니다. 누구든지 무슨 일이 벌어지고 있고 문제를 해결할 수 있는지 알고 있습니까? 다음은이 문제가있는 코드 스 니펫입니다. 내가 사용하고 Node.js를위한 MySQL의 플러그인은 여기Javascript : connection.query 함수가 for 루프를 깨고 있습니다.

https://github.com/felixge/node-mysql

for (j=0;j<rows[i].movelimit;j++){ 
      //j=0 
       sql2="SELECT x, y, land FROM map WHERE collision = 0 AND x>"+(lastX-55)+" AND x<"+(lastX+55)+" AND y>"+(lastY-55)+" AND y<"+(lastY+55)+" AND land='"+rows[i].land+"'"+restrictions; 
       connection.query(sql2, function(err, move, fields) { 
      //j=rows[i]movelimit 

답변

3

은 비동기 콜백 될 것으로 보인다. 따라서 콜백 함수의 범위를 벗어난 루프 변수 j은 항상 루프 종료 전에 할당 된 마지막 값으로 평가됩니다. javascript for loop unexpected behaviour 또는 JavaScript closure inside loops – simple practical example을 참조하십시오.

사용하십시오 closure :

function getCallbackFn(index) { 
    return function(err, move, fields) { 
     .... 
     // "index" will always point to the function argument 
    }; 
} 
for (j=0;j<rows[i].movelimit;j++) { 
    var sql2 = ... 
    connection.query(sql2, getCallbackFn(j)); 
} 

짧은 인라인 IEFE : 100 % 확실 무슨가는 내가 이해에 나는 그것을 시도하지만 것입니다 전에

for (j=0;j<rows[i].movelimit;j++) (function(j){ 
    var sql2 = ... 
    connection.query(sql2, function(err, move, fields) { 
     .... 
     // "j" points to the function argument 
    }); 
})(j); 
+0

나는이 기술을 본 적이 없어 함수에 변수를 전달할 수 없습니다. 둘 이상의 변수를 전달하는 방법을 보여줄 수 있습니까? – Shawn

+0

몇 가지 관련 질문을 연결했습니다. "* 하나 이상의 변수를 넘기는 *"은 무엇을 의미합니까? – Bergi

+0

나는 그것을 발견하고 내가 뭘 찾고 있었는지 이해하는 데 시간이 좀 걸렸다. – Shawn

관련 문제