
비동기 처리 방식이 동기 처리 방식보다 좋은 점이 많지만 어느 함수가 먼저 완료되는지 알 수 없다면 coding flow를 구성하는데 어려움이 발생할 수 밖에 없습니다. 결국 비동기 처리의 순서를 제어하기 위한 방법이 필요한데 그 중에서 대표적인 방식이 Callback Function을 이용하는 것입니다.
const printString = (string) => {
  setTimeout(
    () => {
      console.log(string);
    }, 
    Math.floor(Math.random() * 100) + 1
  );
};
이 코드를 이용해 아래와 같이 실행해 보면, A, B, C의 출력 순서는 절대 고정적으로 정해지지 않습니다.
const printAll = () => {
  printString("A");
  printString("B");
  printString("C");
};
printAll(); // ?
const printString = (string, callback) => {
  setTimeout(
    () => {
      console.log(string);
      callback();
    }, 
    Math.floor(Math.random() * 100) + 1
  );
};
const printAll = () => {
  printString("A", () => {
    printString("B", () => {
      printString("C", () => {})
    });
  });
};
printAll(); // A, B , C
const somethingGonnaHappen = callback => {
  waitingUntilSomethingHappens();
  if (isSomethingGood) {
    callback(null, something);
  }
  if (isSomethingBad) {
    callback(something, null);
  }
}
somethingGonnaHappen((err, data) => {
  if (err) {
    console.log('ERROR!!');
    return;
  }
  return data;
});
코드 출처: 코드스테이츠(CodeStates)