Skip to content

7. 실행 제어: 일시 정지하고 다시 시작하기

YaksokSessionpause, resume 이벤트를 사용하면 코드의 실행을 잠시 멈추거나 재개할 수 있습니다. executionDelay 기능과 함께 사용하기 좋습니다.

실행 일시 정지하기: pause()

session.pause() 메서드를 호출하면, 현재 실행 중인 '달빛 약속' 코드는 가장 가까운 실행 단위(보통 한 줄)를 마친 뒤 즉시 멈춥니다. 한 실행 단위는 블럭 내의 한 줄이거나, 연산 구문 내의 한 항입니다.

typescript
session.pause() // 코드 실행을 일시 정지합니다.

실행 재개하기: resume()

일시 정지된 세션은 session.resume() 메서드를 호출하여 다시 실행할 수 있습니다. resume() 메서드는 Promise<void>를 반환하며, 코드 실행이 완전히 종료되었을 때 resolve됩니다. 따라서 await session.resume() 구문을 사용하면 실행이 끝날 때까지 기다릴 수 있습니다.

typescript
await session.resume() // 코드 실행을 재개하고, 실행이 끝날 때까지 기다립니다.

pauseresume 이벤트 구독하기

SessionConfigevents 객체를 통해 pauseresume 이벤트를 구독할 수 있습니다. 이를 통해 세션이 멈추거나 다시 시작될 때 특정 동작(예: UI 업데이트)을 수행할 수 있습니다.

  • events.pause(): session.pause()가 호출되어 실행이 멈췄을 때 호출됩니다.
  • events.resume(): session.resume()이 호출되어 실행이 재개될 때 호출됩니다.

전체 예제

아래 예제는 1초에 한 줄씩 코드를 실행하다가, 2.5초 뒤에 실행을 멈추고, 다시 2초 뒤에 실행을 재개하는 전체 과정을 보여줍니다.

typescript
import { YaksokSession, SessionConfig } from '@dalbit-yaksok/core'

let output = ''

const session = new YaksokSession({
    stdout(message: string) {
        output += message
        console.log(`[출력] ${message}`)
    },
    events: { 
        pause() { 
            console.log('[알림] 실행이 일시 정지되었습니다.') 
        }, 
        resume() { 
            console.log('[알림] 실행을 다시 시작합니다.') 
        }, 
    }, 
})

session.addModule(
    'main',
    `
"A" 보여주기
"B" 보여주기
"C" 보여주기
"D" 보여주기
`,
    {
        executionDelay: 1000, // 1초에 한 줄씩 실행
    },
)

// runModule은 Promise를 반환하지만, 여기서는 await하지 않고 실행을 시작시킵니다.
const runningPromise = session.runModule('main')

// 2.5초 후에 실행을 일시 정지합니다.
setTimeout(() => {
    console.log('[제어] pause() 호출')
    session.pause()
    // 2.5초 시점에는 "A"와 "B"가 출력되었을 것입니다.
    console.log('현재까지의 출력:', output) // "AB"
}, 2500)

// 4.5초 후에 실행을 재개합니다. (일시 정지 후 2초 뒤)
setTimeout(async () => {
    console.log('[제어] resume() 호출')
    await session.resume()
    // resume()이 반환하는 Promise가 끝나면 모든 실행이 완료된 것입니다.
    console.log('최종 출력:', output) // "ABCD"
}, 4500)

// 전체 실행이 끝날 때까지 기다립니다.
await runningPromise
console.log('모든 실행이 종료되었습니다.')

/*
[출력] A
[출력] B
[제어] pause() 호출
[알림] 실행이 일시 정지되었습니다.
현재까지의 출력: AB
[제어] resume() 호출
[알림] 실행을 다시 시작합니다.
[출력] C
[출력] D
최종 출력: ABCD
모든 실행이 종료되었습니다.
*/