콜백에서 전역 변수를 수정하는 데 문제가 있습니다.전역 변수 수정 및 전달
매 시간마다 파일에서 데이터를 다시로드해야합니다. 내가 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
이 설정되었지만 라우터에서 업데이트되지 않는다는 것입니다. 매 시간마다 업데이트 된 데이터에 액세스해야합니다.
죄송합니다. 그러나 이것은 정말로 나쁜 코드입니다. 비동기 함수의 값을 전역 변수에 채워서 사용하려고합니다. 코드를 작성하는 것은 매우 나쁜 방법입니다. 글로벌 (예 : 비동기 기능이 완료되었을 때)를 언제 사용할 수 있는지 모르기 때문에 예측 가능하게 만들 수 없습니다. 콜백 자체에서'fs.readFile()'의 값을 사용해야하며, 전역 적으로 채워서는 안되며 다른 누군가가 글로벌에서 사용할 올바른 타이밍을 추측 할 수 있기를 바랍니다. 이것은 비동기 프로그래밍의 기초입니다. node.js에서 프로그래밍하려면이 내용을 반드시 알아야합니다. – jfriend00
'라우터'는 어떻게 MY_GLOBAL을 사용합니까? –
'MY_GLOBAL'은 모듈에 대해 로컬입니다. 그것은 전역 변수가 아닙니다. 노드 모듈은 최상위 수준이 아닙니다. 다른 모듈과 공유하고 싶다면이를위한 접근 자 함수를 생성하고 내보내거나 실제 전역 변수로 만들 수 있습니다. 자세한 내용은 http://nodejs.org/api/globals.html을 참조하십시오. 제쳐두고, 제 첫 코멘트를 읽으십시오. 왜냐하면 물건을 비동기로 변환하고 다른 모듈이 그 결과를 받아 들일 수 있기를 기대하기 때문에 일반적으로 프로그램하기가 어렵습니다. – jfriend00