자바스크립트 전역변수를 콜백함수안에서 변경하는 방법은 없나요?

3일째 이것 때문에 머리가 아프네요.

let globalVar;

someModule.func((err, arg) => {
     // err처리부
     globalVar = arg;
}

console.log(globalVar); // undefined

자바스크립트의 비동기적인 특징인 때문이라고 알고 있습니다. 구글링해서 얻은 방법은 콜백함수를 따로 두어 콜백에서 처리하는 것인데 그것도 결국은 undefined라고 뜨네요…

꼭 처리하고 싶은것이라 프로미스 제네레이터 전부 사용해봐도… IIFE 를 사용해도… 제머리로는 해결이 안될거 같아 도움을 청합니다.

콜백함수안에서 전역변수의 수정. 이게 핵심질문입니다.
힌트만 주셔도 제가 공부해서 해결하겠습니다. 한수 가르쳐 주세요…

someModule 이 비동기로 처리해서 그런 것 같은 생각이 막 듭니다.

console.log(globalVar) 이 부분을 콜백 처리 후 사용하고 싶다는 의미라면 위 방식은 잘못된 방식입니다.

  1. globalVar를 사용하려는 부분을 콜백 함수 안에 넣으세요.
let globalVar;

someModule.func((err, arg) => {
     // err처리부
     globalVar = arg;

     // globalVar는 원하는 값으로 초기화 되어있습니다.
     console.log(globalVar); // arg
}
  1. 이런 코딩방법이 싫다면 es7의 async await를 사용하세요.

비동기 프로그래밍의 동작 원리를 공부하신다면 위 코드가 원하는대로 동작하지 않는 이유를 알 수 있습니다.

promise로 요정도면 될 것 같네용 :slight_smile:

let globalVar;

new Promise((resolve, reject) => {
  someModule.func((err, arg) => {
    err ? reject(err) : resolve(arg)
  }
}).then(arg => {
  globalVar = arg;
  console.log(globalVar);
});

콜백이 불리기 전에 console.log가 호출되사 그렇습니다.
콜백 안에서 찍어보세요~

자바스크립트의 함수 실행 순서를 이벤트 루프와 함께 공부하고 뭐가 먼저 실행될지 감을 잡으셔야겠어요~
이런건 원리를 모르면 이해가 안되는 형태입니다. 알면 아무것도 아닌데요.

console.log(globalVar); 를 반드시 전역이나 someModule.func() 밖에서 사용해야 한다면
setTimeout을 쓰는 것도 한 방법!!
단, 지연시간을 someModule.func()이 작업하는 시간을 잘 감안해서 정해야…^^;