export class LockUtil {
public static CreateLock() {
let releaseLock = () => {};
const awaitableLock = new Promise((resolve) => {
releaseLock = () => {
resolve(null);
};
});
return { releaseLock, awaitableLock };
}
}
사용 예시
적용 전
- 동기 흐름 내 별도로 진행되는 비동기 흐름 존재(제어 안되는 상태)
- [1] → [2] → [3]
export async function runServer(app: any) {
// [1]
app.listen(serverConfig.port, () => {
// [3]
// ... => 이 콜백 내부는 별도의 비동기 흐름으로 실행됨
});
// [2]
}
적용 후
- 비동기 콜백의 종료를 대기하여 강제 흐름 제어
- [1] → [2] → [3]
export async function runServerAsync(app: any) {
const { awaitableLock, releaseLock } = LockUtil.CreateLock();
// [1]
app.listen(serverConfig.port, () => {
// ...
releaseLock(); // [2]
});
await awaitableLock;
// [3]
}