원본 코드

export function runServer(app: Koa) {
    app.listen(serverConfig.port, () => {
        
        // .. Do Something Here
    });
}

목표

수정 코드

export async function runServer(app: Koa) {

    let releaseLock = () => {};
    const lockHandle = new Promise((resolve) => {
        releaseLock = () => { resolve(null); };
    });
    
    app.listen(serverConfig.port, () => {
        
        // .. Do Something Here

        releaseLock();
    });

    await lockHandle;
}

상세(실행 순서 표시)

export async function runServer(app: Koa) {

    let releaseLock = () => {};
    // => [1]
    const lockHandle = new Promise((resolve) => {
        // => [2]
        releaseLock = () => { 
		        // => [6]
            resolve(null); 
        };
    });
    
    // => [3]
    app.listen(serverConfig.port, () => {
        
				// => [5]
        releaseLock();
    });
    
		// => [4]
    await lockHandle;
    // => [7]
}

클래스화

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>;
}