2015-01-05 3 views
0

콜백에서 전역 변수를 수정하는 데 문제가 있습니다.전역 변수 수정 및 전달

매 시간마다 파일에서 데이터를 다시로드해야합니다. 내가 readFileSync를 사용하는 경우 그것은 잘 작동하지만 일반 readFile를 사용하지 않을 경우 :

var MY_GLOBAL = {}; 

fs.readFile("some_path", function (err, data) { 
    if (err) throw err; 
    MY_GLOBAL.some_name = data; 
    }); 

setInterval(function() { 
    fs.readFile("some_path", function (err, data) { 
     if (err) throw err; 
     MY_GLOBAL.some_name = data; 
     } 
    }, 60 * 60 * 60 * 1000); 

내 응용 프로그램에 대한 모든 경로를 포함 router.js라는 이름의 다른 모듈이있다.

나는 이것을 router(app, MY_GLOBAL)이라고 부른다.

내 문제는 readFile 콜백에 MY_GLOBAL이 설정되었지만 라우터에서 업데이트되지 않는다는 것입니다. 매 시간마다 업데이트 된 데이터에 액세스해야합니다.

+1

죄송합니다. 그러나 이것은 정말로 나쁜 코드입니다. 비동기 함수의 값을 전역 변수에 채워서 사용하려고합니다. 코드를 작성하는 것은 매우 나쁜 방법입니다. 글로벌 (예 : 비동기 기능이 완료되었을 때)를 언제 사용할 수 있는지 모르기 때문에 예측 가능하게 만들 수 없습니다. 콜백 자체에서'fs.readFile()'의 값을 사용해야하며, 전역 적으로 채워서는 안되며 다른 누군가가 글로벌에서 사용할 올바른 타이밍을 추측 할 수 있기를 바랍니다. 이것은 비동기 프로그래밍의 기초입니다. node.js에서 프로그래밍하려면이 내용을 반드시 알아야합니다. – jfriend00

+1

'라우터'는 어떻게 MY_GLOBAL을 사용합니까? –

+0

'MY_GLOBAL'은 모듈에 대해 로컬입니다. 그것은 전역 변수가 아닙니다. 노드 모듈은 최상위 수준이 아닙니다. 다른 모듈과 공유하고 싶다면이를위한 접근 자 함수를 생성하고 내보내거나 실제 전역 변수로 만들 수 있습니다. 자세한 내용은 http://nodejs.org/api/globals.html을 참조하십시오. 제쳐두고, 제 첫 코멘트를 읽으십시오. 왜냐하면 물건을 비동기로 변환하고 다른 모듈이 그 결과를 받아 들일 수 있기를 기대하기 때문에 일반적으로 프로그램하기가 어렵습니다. – jfriend00

답변

0

확인할 사항을 몇 가지 제안 할 수 있습니다.

먼저 콜백 함수가 console.log 또는 alert을 사용하여 실행되고 있는지 확인합니다.

개체가 자바 스크립트에서 참조로 전달된다는 점도 지적하고 싶습니다. 즉, router에 전달 된 개체는 MY_GLOBAL에 대한 참조이며 MY_GLOBAL 복사본이 아닙니다. 이것이 잘못 될 수있는 곳은 MY_GLOBAL을 다시 할당 한 경우입니다. 어디에서든지 MY_GLOBAL을 재 할당하지 않았 음을 확인합니다.

또한 data이 개체 (문자열, 숫자 또는 부울과 반대) 인 경우 다시 할당되지 않았는지 확인해야합니다. 예를 들어 router 안에 MY_GLOBAL.some_name 값을 읽으면 data이 MY_GLOBAL.some_name에 할당 된 후 이전 버전에 대한 참조를 유지할 수 있습니다.

+0

'MY_GLOBAL'은 전역 변수가 아닙니다. 전역 변수가 아니고 다른 모듈에서 직접 볼 수없는 최상위 모듈 변수입니다. – jfriend00

0

많은 사람들이 module 키워드를 사용하려고하지 않는 이유는 글로벌 문이 window입니다.

다른 것. 매시간 함수 코드를 실행하려고합니다. 두 번째 매개 변수에 하나의 추가 60 곱하기를 넣습니다. 이 시도.

module.MY_GLOBAL = {}; 

var callbackFunction = function(){ 
    fs.readFile("some_path", function (err, data) { 
    if (err) throw err; 
    module.MY_GLOBAL.some_name = data; 
    } 
}; 
callbackFunction(); 
setInterval(callbackFunction , 60 * 60 * 1000); // 360000 == 1 hour