날짜 : 2017. 11. 28.(화)
callback 함수는 비동기가 아니다.
생각하게 된 동기
- callback은 javascript Engine의 call stack을 다 실행한 뒤 eventloop에 있는 것을 실행한다고 알고 있다.
- 하지만 아래의 예제에서 다른 결과가 나왔다.
예제1
//예상 1, 3, 2 출력
var data = [{"user":1}, {"user":2}, {"user":3}]
console.log("1")
console.log(data[0].power)
data.forEach(function(data){
data.power = data.user + 10
console.log("2")
})
console.log(data[0].power)
console.log("3")
//결과 1, 2, 3 출력
예제2
//예상 1,2,4,3 출력
console.log(1)
var arr = [];
for(var i = 0; i < 10000000; i++){
arr.push({'num':i})
}
console.log(2)
arr.forEach(function(v, i) {
v.power = v.num + 100
if(v.num==100) console.log(3)
})
console.log(4)
//결과 1,2,3,4 출력
예제3
//예상 1,2,4,3 출력
var fs = require('fs');
console.log(1);
var data = fs.readFileSync('./data.txt', {encoding:'utf8'});
console.log(data)
console.log(2);
fs.readFile('data.txt', {encoding:'utf8'}, function(err, data) {
console.log(3);
console.log(data)
});
console.log(4);
//결과 1,2,4,3 출력
알게된 점
난 아직 callback을 다 안다고 할 수 없다. 조심해서 사용할 수 밖에 없다.
-
node.js는 이벤트 기반 non-block I/O 모델 이다. (공식사이트 소개 문구)
- block과 non-block은 아래의 "참고한 게시물-slipp게시물"을 참고해 주시기 바랍니다.
-
예제1,2 번은 운영체제로의 systemcall을 하지 않는다.라고 추측한다.
- 예제3번은 File호출을 하여 I/O가 발생을 하는데, 예제1,2번은 CPU상에서 계속 작업을 한다.
-
이왕이면 forEach() 보다는 for문을 사용하고 dataflow 일관성을 위하여 File I/O, DB I/O, AJAX 호출 에만 callback 함수를 사용하는 것이 좋을것 같다.
참고한 사이트
'개발일지' 카테고리의 다른 글
D3의 늪에 빠지다. (D3 개발 Tip) (0) | 2017.12.01 |
---|---|
D3는 그림 위에 그림을 그린다. (0) | 2017.11.29 |
react와 알게된 내용 2 - webpack (0) | 2017.11.23 |
React와 알게된 내용 정리 1 (0) | 2017.11.22 |
react와 boostrap과 reactbootstrap. (0) | 2017.11.20 |