AI翻訳通知

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

ctx.exit()

現在のイベントフローの実行を終了し、後続のステップは実行されません。業務条件が満たされない場合、ユーザーによるキャンセル、または回復不能なエラーが発生した場合によく使用されます。

適用シーン

ctx.exit() は、JS が実行可能な以下のコンテキストで一般的に使用されます:

シーン説明
イベントフローフォームの送信やボタンクリックなどによってトリガーされるイベントフローにおいて、条件が満たされない場合に後続のステップを中止します。
連動ルールフィールド連動やフィルタ連動などで、バリデーションに失敗した場合や実行をスキップする必要がある場合に、現在のイベントフローを終了します。
アクションイベントカスタムアクション(削除確認、保存前のバリデーションなど)において、ユーザーがキャンセルした場合やバリデーションが通らない場合に終了します。

ctx.exitAll() との違い:ctx.exit() は現在のイベントフローのみを終了し、同じイベント内の他のイベントフローには影響しません。ctx.exitAll() は、現在のイベントフローおよび同じイベント内でまだ実行されていない後続のイベントフローを終了します。

型定義

exit(): never;

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

ctx.exitAll() との比較

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

示例

ユーザーキャンセル時に終了する

// 確認モーダルで、ユーザーがキャンセルをクリックした場合はイベントフローを終了する
if (!confirmed) {
  ctx.message.info('操作がキャンセルされました');
  ctx.exit();
}

パラメータバリデーション失敗時に終了する

// バリデーションが通らない場合にメッセージを表示して終了する
if (!params.value || params.value.length < 3) {
  ctx.message.error('パラメータが無効です。長さは少なくとも 3 文字必要です');
  ctx.exit();
}

業務条件が満たされない場合に終了する

// 条件が満たされない場合に終了し、後続のステップは実行されない
const record = ctx.model?.getValue?.();
if (!record || record.status !== 'draft') {
  ctx.notification.warning({ message: '下書き状態のみ提出可能です' });
  ctx.exit();
}

ctx.exit() と ctx.exitAll() の使い分け

// 現在のイベントフローのみを終了させる場合 → ctx.exit() を使用
if (!params.valid) {
  ctx.message.error('パラメータが無効です');
  ctx.exit();  // 他のイベントフローには影響しない
}

// 現在のイベントにおけるすべての後続イベントフローを終了させる必要がある場合 → ctx.exitAll() を使用
if (!ctx.model?.context?.getPermission?.()) {
  ctx.notification.warning({ message: '権限が不足しています' });
  ctx.exitAll();  // メインのイベントフローおよび同じイベント内の後続イベントフローをまとめて終了する
}

モーダル確認後のユーザーの選択に基づいて終了する

const ok = await ctx.modal?.confirm?.({
  title: '削除の確認',
  content: '削除すると元に戻せません。続行しますか?',
});
if (!ok) {
  ctx.message.info('キャンセルされました');
  ctx.exit();
}

注意事項

  • ctx.exit() を呼び出した後、現在の JS 内の後続コードは実行されません。呼び出す前に ctx.messagectx.notification、またはモーダルを使用してユーザーに理由を説明することをお勧めします。
  • 業務コード内で FlowExitException をキャッチする必要はありません。イベントフローエンジンに処理を任せてください。
  • 現在のイベントにおけるすべての後続イベントフローを終了させる必要がある場合は、ctx.exitAll() を使用してください。

関連情報

  • ctx.exitAll():現在のイベントフローおよび同じイベント内の後続イベントフローを終了します
  • ctx.message:メッセージ表示
  • ctx.modal:確認モーダル