3일째 이것 때문에 머리가 아프네요.
let globalVar;
someModule.func((err, arg) => {
// err처리부
globalVar = arg;
}
console.log(globalVar); // undefined
자바스크립트의 비동기적인 특징인 때문이라고 알고 있습니다. 구글링해서 얻은 방법은 콜백함수를 따로 두어 콜백에서 처리하는 것인데 그것도 결국은 undefined라고 뜨네요…
꼭 처리하고 싶은것이라 프로미스 제네레이터 전부 사용해봐도… IIFE 를 사용해도… 제머리로는 해결이 안될거 같아 도움을 청합니다.
콜백함수안에서 전역변수의 수정. 이게 핵심질문입니다.
힌트만 주셔도 제가 공부해서 해결하겠습니다. 한수 가르쳐 주세요…
someModule 이 비동기로 처리해서 그런 것 같은 생각이 막 듭니다.
kesakiyo
(Minho Cheon)
3
console.log(globalVar)
이 부분을 콜백 처리 후 사용하고 싶다는 의미라면 위 방식은 잘못된 방식입니다.
- globalVar를 사용하려는 부분을 콜백 함수 안에 넣으세요.
let globalVar;
someModule.func((err, arg) => {
// err처리부
globalVar = arg;
// globalVar는 원하는 값으로 초기화 되어있습니다.
console.log(globalVar); // arg
}
- 이런 코딩방법이 싫다면 es7의
async
await
를 사용하세요.
비동기 프로그래밍의 동작 원리를 공부하신다면 위 코드가 원하는대로 동작하지 않는 이유를 알 수 있습니다.
june
(최준석)
4
promise로 요정도면 될 것 같네용 
let globalVar;
new Promise((resolve, reject) => {
someModule.func((err, arg) => {
err ? reject(err) : resolve(arg)
}
}).then(arg => {
globalVar = arg;
console.log(globalVar);
});
콜백이 불리기 전에 console.log가 호출되사 그렇습니다.
콜백 안에서 찍어보세요~
자바스크립트의 함수 실행 순서를 이벤트 루프와 함께 공부하고 뭐가 먼저 실행될지 감을 잡으셔야겠어요~
이런건 원리를 모르면 이해가 안되는 형태입니다. 알면 아무것도 아닌데요.
iclouds
(iclouds)
7
console.log(globalVar); 를 반드시 전역이나 someModule.func() 밖에서 사용해야 한다면
setTimeout을 쓰는 것도 한 방법!!
단, 지연시간을 someModule.func()이 작업하는 시간을 잘 감안해서 정해야…^^;