logologo
시작
가이드
개발
플러그인
API
홈
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
시작
가이드
개발
플러그인
API
홈
logologo
RunJS 개요
모듈 가져오기
컨테이너 내 렌더링

전역 변수

window
document
navigator

ctx

ctx.blockModel
ctx.collection
ctx.collectionField
ctx.dataSource
ctx.dataSourceManager
ctx.element
ctx.exit()
ctx.exitAll()
ctx.filterManager
ctx.form
ctx.getModel()
ctx.getValue()
ctx.getVar()
ctx.i18n
ctx.importAsync()
ctx.initResource()
ctx.libs
ctx.location
ctx.logger
ctx.makeResource()
ctx.message
ctx.modal
ctx.model
ctx.notification
ctx.off()
ctx.on()
ctx.openView()
ctx.render()
ctx.request()
ctx.requireAsync()
ctx.resource
ctx.route
ctx.router
ctx.setValue()
ctx.sql
ctx.t()
ctx.view
Previous Pagectx.exit()
Next Pagectx.filterManager
AI 번역 알림

이 문서는 AI에 의해 번역되었습니다. 정확한 정보는 영어 버전을 참조하세요.

#ctx.exitAll()

현재 이벤트 흐름과 동일한 이벤트 디스패치(Dispatch) 내에서 트리거된 모든 후속 이벤트 흐름을 종료합니다. 주로 전역 오류나 권한 검증으로 인해 현재 이벤트 하위의 모든 이벤트 흐름을 즉시 중단해야 할 때 사용합니다.

#적용 사례

ctx.exitAll()은 일반적으로 JS 실행이 가능한 컨텍스트에서 현재 이벤트 흐름과 해당 이벤트로 인해 트리거된 후속 이벤트 흐름을 동시에 중단해야 할 때 사용됩니다.

시나리오설명
이벤트 흐름메인 이벤트 흐름 검증 실패 시(예: 권한 부족), 메인 흐름 및 동일 이벤트 내에서 아직 실행되지 않은 후속 흐름을 중단해야 하는 경우
연동 규칙연동 검증을 통과하지 못했을 때, 현재 연동 및 동일 이벤트로 트리거된 후속 연동을 종료해야 하는 경우
작업 이벤트작업 전 사전 검증 실패 시(예: 삭제 전 권한 체크), 메인 작업 및 후속 단계를 차단해야 하는 경우

ctx.exit()와의 차이점: ctx.exit()는 현재 이벤트 흐름만 종료합니다. 반면 ctx.exitAll()은 현재 이벤트 디스패치에서 아직 실행되지 않은 후속 이벤트 흐름까지 모두 종료합니다.

#타입 정의

exitAll(): never;

ctx.exitAll()을 호출하면 내부적으로 FlowExitAllException이 발생하며, 이벤트 흐름 엔진이 이를 캡처하여 현재 이벤트 흐름 인스턴스와 동일 이벤트 하위의 후속 이벤트 흐름을 중지합니다. 호출된 이후의 현재 JS 코드 내 나머지 구문은 실행되지 않습니다.

#ctx.exit()와의 비교

메서드작용 범위
ctx.exit()현재 이벤트 흐름만 종료하며, 후속 이벤트 흐름은 영향을 받지 않습니다.
ctx.exitAll()현재 이벤트 흐름을 종료하고, 동일 이벤트 하위에서 순차적으로 실행되는 후속 이벤트 흐름을 중단합니다.

#실행 모드 설명

  • 순차 실행 (sequential): 동일 이벤트 하위의 이벤트 흐름이 순서대로 실행됩니다. 어느 한 이벤트 흐름에서 ctx.exitAll()을 호출하면 후속 이벤트 흐름은 더 이상 실행되지 않습니다.
  • 병렬 실행 (parallel): 동일 이벤트 하위의 이벤트 흐름이 병렬로 실행됩니다. 특정 이벤트 흐름에서 ctx.exitAll()을 호출해도 이미 병렬로 시작된 다른 이벤트 흐름은 중단되지 않습니다(각각 독립적으로 동작).

#예시

#권한 검증 실패 시 모든 이벤트 흐름 종료

// 권한이 부족할 때, 메인 이벤트 흐름 및 후속 이벤트 흐름 중단
if (!hasPermission(ctx)) {
  ctx.notification.error({ message: '작업 권한이 없습니다' });
  ctx.exitAll();
}

#전역 사전 검증 미통과 시 종료

// 예: 삭제 전 관련 데이터가 있어 삭제할 수 없는 경우, 메인 이벤트 흐름 및 후속 작업 차단
const canDelete = await checkDeletable(ctx.model?.getValue?.());
if (!canDelete) {
  ctx.message.error('연관된 데이터가 존재하여 삭제할 수 없습니다');
  ctx.exitAll();
}

#ctx.exit()와의 선택 사용

// 현재 이벤트 흐름만 종료해야 하는 경우 → ctx.exit() 사용
if (!params.valid) {
  ctx.message.error('파라미터가 유효하지 않습니다');
  ctx.exit();  // 후속 이벤트 흐름은 영향을 받지 않음
}

// 현재 이벤트 하위의 모든 후속 이벤트 흐름을 종료해야 하는 경우 → ctx.exitAll() 사용
if (!ctx.model?.context?.getPermission?.()) {
  ctx.notification.warning({ message: '권한이 부족합니다' });
  ctx.exitAll();  // 메인 이벤트 흐름 및 동일 이벤트 하위의 후속 이벤트 흐름이 함께 종료됨
}

#안내 메시지 후 종료

if (!isValidInput(ctx.form?.getValues?.())) {
  ctx.message.warning('양식의 오류를 먼저 수정해 주세요');
  ctx.exitAll();
}

#주의 사항

  • ctx.exitAll() 호출 후 현재 JS의 후속 코드는 실행되지 않습니다. 호출 전에 ctx.message, ctx.notification 또는 팝업을 통해 사용자에게 중단 사유를 설명하는 것이 좋습니다.
  • 비즈니스 코드에서 FlowExitAllException을 직접 캡처할 필요는 없으며, 이벤트 흐름 엔진이 처리하도록 두면 됩니다.
  • 후속 이벤트 흐름에 영향을 주지 않고 현재 흐름만 중지하려면 ctx.exit()를 사용하세요.
  • 병렬 모드에서 ctx.exitAll()은 현재 이벤트 흐름만 종료하며, 이미 병렬로 실행 중인 다른 이벤트 흐름을 방해하지 않습니다.

#관련 정보

  • ctx.exit(): 현재 이벤트 흐름만 종료
  • ctx.message: 메시지 알림
  • ctx.modal: 확인 팝업