자바스크립트에는 다음과 같은 전달방식이 있다.
연속전달방식은 다음으로 나뉜다.
자바스크립트에서 콜백은 다른 함수에 인수로 전달되는 함수이며, 작업이 완료되면 결과로 호출된다. 이해를 위해서 코드를 써보자면 이렇다
const settimeout = await(callback, 0) => {
callback(); // 함수가 인자로 전달되었다.
}
함수형 프로그래밍에서 결과를 전달하는 이러한 방식을 연속 전달 방식 CPS라고 한다. 이는 일반적인 개념이고, 항상 비동기 작업과 관련이 있는 것은 아니다. 사실상 단순히 결과를 호출자에게 직접 반환하는 대신 다른 함수(콜백)으로 전달함으로써 결과를 전달하는 방식을 말하는 것이다.
특별한 것은 없는데, 결과를 return 문으로 전달하는 것을 직접 스타일(direct style)이라고 하는데, 동기화 프로그래밍에서 일반적으로 결과를 반환하는 방식이다. 여기서 연속 전달 방식으로 바꾸면 return 문대신에 다른 함수로 그 결과값을 반환하는 방식으로 짜면 된다.
const setitmeout = (a, b, callback) => {
callback(a + b);
}
이렇게 하면 동기화된 CPS함수로 콜백이 완료 될 때만 값이 반환이 된다.
이것은 우리가 흔히 쓰는 콜백 함수로 위와 같은 스타일에 비동기처리 문구를 더해준 방법이다. 비동기식으로 연속 전달 방식으로 쓰면 이벤트 루프에 해당 작업을 던지고 다음에 처리해야할 작업을 처리하고 그 작업이 완료될 때에 콜백 함수로 그 결과 값을 전달한다. 이때에 그 콜백 함수를 실행하기 때문에 새로운 스택에 콜백함수가 삽입이 된다. 클로저 덕분에 콜백이 처음 실행 되었던 그 시점과는 다른 시점과 다른 위치에서 호출되더라도 비동기 함수의 호출자 컨텍스트를 유지하기 때문에 이벤트루프에서 새로운 스택이 시작 될 수 있는 것이다. 동기 함수는 조작이 완료할 때까지 다음 작업을 실행하지도 않고, 스택에 새로운 것을 쌓지도 않지만 비동기 함수는 블록없이 제어를 즉시 반환하고 결과는 이벤트 루프의 다음 사이클인 콜백으로 전달한다.
함수에 콜백 인자가 있으면, 함수가 비동식이거나, 연속 전달 스타일을 사용한다고 가정할 수 있다. 그러나 항상 그런 것은 아닌데, 예를 들어 Array 객체의 map함수를 들수가 있다.