Ver. 1

export class LockUtil {
    public static CreateLock() {
        let releaseLock = () => {};
        const awaitableLock = new Promise((resolve) => {
            releaseLock = () => { 
                resolve(null); 
            };
        });
        return { releaseLock, awaitableLock };
    }
}

Ver. 2

export class Lock {

    constructor() {
        this.handle = new Promise<void>((resolve) => {
            this.release = () => { resolve(null); };
        });
    }

    public static Create() {
        return new Lock();
    }

    public release: () => void;
    public handle: Promise<void>;
}

사용 예시

적용 전

export async function runServer(app: any) {
    // [1]
    app.listen(serverConfig.port, () => {
		    // [3]
        // ... => 이 콜백 내부는 별도의 비동기 흐름으로 실행됨
    });
    // [2]
}

적용 후

export async function runServerAsync(app: any) {
    const { awaitableLock, releaseLock } = LockUtil.CreateLock();
    // [1]
    app.listen(serverConfig.port, () => {
        // ...
        releaseLock(); // [2]
    });

    await awaitableLock;
    // [3]
}