7. 실행 제어: 일시 정지하고 다시 시작하기
YaksokSession
의 pause
, resume
이벤트를 사용하면 코드의 실행을 잠시 멈추거나 재개할 수 있습니다. executionDelay
기능과 함께 사용하기 좋습니다.
실행 일시 정지하기: pause()
session.pause()
메서드를 호출하면, 현재 실행 중인 '달빛 약속' 코드는 가장 가까운 실행 단위(보통 한 줄)를 마친 뒤 즉시 멈춥니다. 한 실행 단위는 블럭 내의 한 줄이거나, 연산 구문 내의 한 항입니다.
typescript
session.pause() // 코드 실행을 일시 정지합니다.
실행 재개하기: resume()
일시 정지된 세션은 session.resume()
메서드를 호출하여 다시 실행할 수 있습니다. resume()
메서드는 Promise<void>
를 반환하며, 코드 실행이 완전히 종료되었을 때 resolve됩니다. 따라서 await session.resume()
구문을 사용하면 실행이 끝날 때까지 기다릴 수 있습니다.
typescript
await session.resume() // 코드 실행을 재개하고, 실행이 끝날 때까지 기다립니다.
pause
와 resume
이벤트 구독하기
SessionConfig
의 events
객체를 통해 pause
와 resume
이벤트를 구독할 수 있습니다. 이를 통해 세션이 멈추거나 다시 시작될 때 특정 동작(예: 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
모든 실행이 종료되었습니다.
*/