AI翻訳通知

このドキュメントはAIによって翻訳されました。正確な情報については英語版をご参照ください。

ctx.exitAll()

現在のイベントフローと、同じイベントディスパッチ内でトリガーされた後続のすべてのイベントフローを終了します。グローバルエラーや権限チェックにより、現在のイベント配下のすべてのイベントフローを即座に中止する必要がある場合によく使用されます。

適用シーン

ctx.exitAll() は通常、以下の JS 実行コンテキストにおいて、現在のイベントフローと、そのイベントによってトリガーされる後続のイベントフローを同時に中止する必要がある場合に使用されます。

シーン説明
イベントフローメインイベントフローのバリデーションに失敗した場合(権限不足など)、メインフローおよび同じイベント配下でまだ実行されていない後続のフローを中止する必要があります。
連動ルール連動バリデーションが通らない場合、現在の連動および同じイベントでトリガーされる後続の連動を終了する必要があります。
操作イベント操作前のバリデーションに失敗した場合(削除前の権限チェックなど)、メインの操作および後続のステップを阻止する必要があります。

ctx.exit() との違い:ctx.exit() は現在のイベントフローのみを終了します。ctx.exitAll() は、現在のイベントディスパッチにおいてまだ実行されていない後続のイベントフローも終了します。

型定義

exitAll(): never;

ctx.exitAll() を呼び出すと、内部的に FlowExitAllException がスローされます。これはイベントフローエンジンによってキャッチされ、現在のイベントフローインスタンスと同じイベント配下の後続イベントフローを停止します。呼び出されると、現在の JS コード内の残りのステートメントは実行されません。

ctx.exit() との比較

メソッド影響範囲
ctx.exit()現在のイベントフローのみを終了し、後続のイベントフローには影響しません。
ctx.exitAll()現在のイベントフローを終了し、同じイベント配下で順次実行(sequential)される後続のイベントフローも中止します。

実行モードの説明

  • 順次実行(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.messagectx.notification、またはモーダルなどを使用して、ユーザーに理由を説明することをお勧めします。
  • 業務コード内で FlowExitAllException をキャッチする必要は通常ありません。イベントフローエンジンに処理を任せてください。
  • 後続のイベントフローに影響を与えずに現在のイベントフローのみを停止したい場合は、ctx.exit() を使用してください。
  • 並列モードでは、ctx.exitAll() は現在のイベントフローのみを終了し、他の並行実行中のイベントフローを中断することはありません。

関連情報