2013-12-21 3 views
1

Node.js가있는 작은보고 도구를 만들고 있는데 자바 스크립트의 범위 지정 문제가 있습니다. 함수를 호출하고 데이터베이스 쿼리에서 도시와 배열을 반환해야합니다. 여기 함수.Js 함수가 반환하지 않음

function queryBuilderZone() { 
    var includedCities = new Array(); 
    q = heredoc(function(){/* 
     SELECT majlis.MajlisId 
     FROM majlis 
     WHERE majlis.ZoneId = -ZONE- 
    */}); 
    q = q.replace(/-ZONE-/g, inZone); 

    connection.query(q, function(err, rows, fields) { 
     if (err) throw err; 
     var rowsLentgh = rows.length; 
     for (var i = 0; i < rowsLentgh; i++) { 
       includedCities.unshift(rows[i].MajlisId); 
     }; 
     console.log(includedCities); // <-- output correct: ['...', '....'] 
    }); 
    connection.end(); 
    console.log(includedCities); // <-- output wrong: [] 
    return includedCities; 

}

이 어디에 문제가 왜이 함수는 배열 includedCities의 요소를 반환하지 않습니다 메인 프로그램

includedCities = queryBuilderZone(); 
console.log(includedCities); // <-- output wrong: [] 

에서 내 전화입니까?
그리고 connection.query의 범위에서 올바른 값과 예상 값을 보여줍니다.

그런데 쿼리를 작성하고 쿼리에서 자리 표시자를 바꾸려면 mysql 모듈을 사용하고 있습니다.

+0

표준 비동기 사례입니다. 콜백이 완료되기 전에 "잘못된"콘솔 로그가 발생합니까? "includeCities"는 함수의 로컬 변수입니다. – npup

+0

이것은 나에게 이것이 범위 지정 문제라고 생각합니다. 나는 node.js 사람이 아니지만 includeCities는 전역 범위에없는 queryBuilderZone 함수 내에서 정의됩니다. 함수 위로 전역 범위로 이동하십시오. –

+0

@rontornambe 이것은 작은 자습서를 읽을 시간을 찾지 못한 node.js 초보자의 전형적인 문제입니다. – hgoebl

답변

3

여기서 돌아가는 것과 콜백의 차이점은 무엇입니까? connection.query() 함수가 그 정보를 얻기 위해 손을 내밀 필요가 있기 때문에 queryBuilderZone() 함수가 시작된 후에 계속 작동하고 그 때인 includedCities이 비어있는 Array라는 결론에 도달합니다. 당신이 원하는 무엇

는 queryBuilderZone에 콜백에서 패스, 당신이 그것을 사용하고자 할 때 다음, 당신이 그렇게 같이 할 거라고이

function queryBuilderZone(callback) { 
    var includedCities = new Array(); 
    q = heredoc(function() { 
     /* 
     SELECT majlis.MajlisId 
     FROM majlis 
     WHERE majlis.ZoneId = -ZONE- 
    */ 
    }); 
    q = q.replace(/-ZONE-/g, inZone); 

    connection.query(q, function (err, rows, fields) { 
     if (err) throw err; 
     var rowsLentgh = rows.length; 
     for (var i = 0; i < rowsLentgh; i++) { 
      includedCities.unshift(rows[i].MajlisId); 
     }; 
     console.log(includedCities); // <-- output correct: ['...', '....'] 
     callback(includedCities); 
    }); 
    connection.end(); 
    console.log(includedCities); // <-- output wrong: [] 
    // return includedCities; Not needed 
} 

같은 것입니다. connection.query 후 실행됩니다 콜백 함수에있어 무엇이든지

queryBuilderZone(function(includedCities) { 
    // Do what you'd like here 
    console.log(includedCities); // <-- output correct: ['...', '....'] 
}); 

는 과정을 실행하고, 배열을 뱉어.

+1

감사합니다! 나는 콜백에 대해 몰랐다. 그러므로 나는 단지 문제를 동시에 배우려고 노력하고있다. 나는 다른 언어로 그것을 해결할 수 있었지만. 나는 콜백을위한 좋은 튜토리얼을 가지고있다. 그리고 공유하는 것을 주저하지 않는다. :) – imalik8088

관련 문제