# Chapter17. 타임라인 조율하기
# 1. 타임라인을 나누기 위한 동시성 기본형
# (1) Cut()
함수 => Promise.all()
과 유사한듯
// num - 기다릴 타임라인의 수, callback - 모든 것이 끝났을 때 실행할 콜백
function Cut(num, callback) {
var num_finished = 0; // 카운터를 0으로 초기화
return function() { // 리턴되는 함수는 타임라인이 끝났을 때 호출함
num_finished += 1; // 함수를 호출할 때마다 카운터가 증가
if (num_finished === num) {
callback(); // 마지막 타임라인이 끝났을 때 콜백을 호출
};
};
}
var done = Cut(3, function() {
console.log('finished!');
});
done();
done();
done(); // 이 때 console.log 찍힘
# (2) 적용 예시
Cut()
을 보관할 범위- 응답 콜백 끝에서
done()
을 불러야 한다. - 따라서 두 응답 콜백 만드는
calc_cart_total()
함수 범위에Cut()
을 만드는 것이 좋다.
- 응답 콜백 끝에서
Cut()
에 어떤 콜백을 넣을지calc_cart_total()
에는total
값 계산이 끝났을 때 부르는 콜백이 이미 있다.- 실제로
update_total_dom()
이 실행될 것 같지만Cut()
은 어떤 것을 호출하는지는 상관이 없다. - 따라서
Cut()
콜백에서calc_cart_total()
콜백을 실행하면 된다.
function calc_cart_total(cart, callback) {
var total = 0;
var done = Cut(2, function() {
callback(total);
});
cost_ajax(cart, function(cost) {
total += cost;
done();
});
shipping_ajax(cart, function(shipping) {
total += shipping;
done();
});
}
# 2. 딱 한 번만 호출하는 기본형
# (1) JustOnce()
함수 => Promise.race()
와 유사한듯
- 최초 한 번만 효과가 발생하는 액션을 멱등원(idempotent)이라고 한다.
JustOnce()
는 어떤 액션이든 멱등원으로 만들어준다.
// action - 액션을 전달
function JustOnce(action) {
var alreadyCalled = false; // 함수가 실행됐는지 기억한다.
return function(a, b, c) {
if (alreadyCalled) return; // 실행한 적이 있다면 바로 종료한다.
alreadyCalled = true; // 함수가 실행됐다고 생각하고 실행한 사실을 기록한다.
return action(a, b, c); // 인자와 함께 액션을 호출한다.
}
}
# 3. 자바스크립트의 시간 모델
- 순차적 구문은 순서대로 실행된다.
- 두 타임라인에 있는 단계는 왼쪽 먼저 실행되거나, 오른쪽 먼저 실행될 수 있다.
- 비동기 이벤트는 새로운 타임라인에서 실행된다.
- 액션은 호출될 때마다 실행된다.
# 4. 동시성 기본형 정리
Queue()
,DroppingQueue()
는 자원을 공유하기 위한 동시성 기본형이고,Cut()
,JustOnce()
는 타임라인을 조율하여 액션에 순서나 반복을 제한해주는 동시성 기본형이다.
함수 | 내용 |
---|---|
Queue() | 큐에 추가된 항목은 독립적으로 하나의 타임라인에서 처리된다. 하나의 항목이 처리되어야 다음 항목을 처리할 수 있다. |
DroppingQueue() | Queue() 와 비슷하지만 항목이 빠르게 늘어나면 작업을 건너뛴다. 특정 개수 이상 큐에 항목을 추가하지 못하고 싶을 때 사용된다. |
Cut() | 모든 타임라인이 완료되면 콜백을 불러 새로운 타임라인을 시작한다. |
JustOnce() | 첫 번째로 실행되는 타임라인이 콜백이 끝나면 콜백이 실행되는 동시성 기본형으로 여러 번 불러도 한 번만 실행된다. |