> [!quote]
> [Async, Sync, in Between](https://antfu.me/posts/async-sync-in-between)를 읽고 정리했다. 번역: [[번역] 동기와 비동기 그 사이 어딘가 - Medium](https://medium.com/@jiwoochoics/번역-동기와-비동기-그-사이-어딘가-adf03d537aad)
**비동기 감염 (async inflection)**
: 비동기를 호출하는 함수가 모두 비동기가 되는 전파 현상
동기 함수는 비동기 함수를 직접 호출할 수 없고, 자신도 비동기로 변해야 하기 때문에
![[a1a80ada-a15c-4183-a0cd-30991b17c9da.png]]
**양방향 제약**
- 동기 함수는 자기가 호출하는 함수들이 모두 동기여야 함. 비동기라면 자신도 비동기가 되어야 하기 때문.
- 비동기 함수는 자신을 호출하는 함수들이 모두 비동기여야 함.
이런 제약조건에 갇히지 않기 위해서 일부 라이브러리들은 동일한 로직을 비동기로/동기로 동작하는 두가지 API를 만든다. 예를 들어 [find-up](https://github.com/sindresorhus/find-up)의 `findUp`, `findSync`.
내부적으로 선택적인 비동기 동작이 있다면 결국 동기 / 비동기로 나눠 개발되어야 함. 색깔이 퍼지니까 중복 로직이 많아진다.
[quansync](https://github.com/quansync-dev/quansync)
이 사람이 만든 동기와 비동기 둘 다 사용할 수 있는 함수를 제공하는 라이브러리.
호출되는 컨텍스트에 따라 동기 또는 비동기로 동작한다.
제너레이터 문법이 부담스럽다면 [unplugin-quansync](https://github.com/quansync-dev/unplugin-quansync) 라이브러리도 있다.
보라색 함수들은 맥락에 따라서 동기가 될 수도, 비동기가 될 수도 있다.
![[b939675f-73eb-4b38-89f4-e9040255bc3c.png]]
**동작 원리**
로직을 여러 개의 청크로 나눠서 호출자가 원하는 시점에 다음 청크를 실행할 수 있도록 제어한다.
제너레이터의 `yield`를 이용해서 언제 실행을 재개할 지 제어한다.
비동기 context에서는 비동기 작업이 완료될 때까지 기다렸다가 다음 청크 실행 재개.
동기 context에서는 다음 청크를 바로 실행.