では 部署ごとにフラグ+非同期並列処理でスキップする実務パターン を作ります。
シナリオ:部署ごとのユーザーを非同期処理、条件に合わなければ部署単位でスキップ
想定:
- 部署ごとに API でユーザーを取得
- 名前なし・非アクティブはスキップ
- その部署に有効なユーザーが1人もいなければ部署単位で処理スキップ
- 条件に合うユーザーだけ非同期処理(並列)
コード例
// 擬似API: 部署ごとのユーザー取得
async function fetchDepartmentUsers(deptName) {
const users = [
{name:"Alice", active:true},
{name:"Bob", active:false},
{name:"", active:true},
{name:"Charlie", active:true}
];
// 部署名でデータを変えてみる
if (deptName === "開発部") users.push({name:"David", active:true});
return users;
}
// 非同期処理関数(例: API呼び出し、DB保存など)
function processUser(user) {
return new Promise(resolve => {
setTimeout(() => {
console.log(`処理完了: ${user.name}`);
resolve();
}, 300);
});
}
// メイン処理
async function main() {
const departments = ["営業部", "開発部", "人事部"];
for (const dept of departments) {
console.log(`--- ${dept} 処理開始 ---`);
const users = await fetchDepartmentUsers(dept);
// 部署に有効ユーザーがいるか判定するフラグ
const validUsers = [];
for (const user of users) {
if (!user.name) continue; // 名前なしはスキップ
if (!user.active) continue; // 非アクティブはスキップ
validUsers.push(user);
}
// 有効ユーザーが1人もいなければ部署単位でスキップ
if (validUsers.length === 0) {
console.log(`${dept} に有効ユーザーなし → スキップ`);
continue; // 次の部署へ
}
// 条件を満たすユーザーのみ並列で処理
await Promise.all(validUsers.map(user => processUser(user)));
console.log(`--- ${dept} 処理完了 ---`);
}
console.log("全部署処理完了");
}
main();
JavaScript想定出力
--- 営業部 処理開始 ---
処理完了: Alice
処理完了: Charlie
--- 営業部 処理完了 ---
--- 開発部 処理開始 ---
処理完了: Alice
処理完了: Charlie
処理完了: David
--- 開発部 処理完了 ---
--- 人事部 処理開始 ---
人事部 に有効ユーザーなし → スキップ
全部署処理完了
ポイント解説
- 内側ループで
continueでユーザー単位のスキップ- 名前なし・非アクティブユーザーを処理せずスキップ
- フラグ(配列)で部署単位のスキップ
- 条件を満たすユーザーが1人もいない場合、部署全体を処理せず
continue
- 条件を満たすユーザーが1人もいない場合、部署全体を処理せず
- 並列処理(
Promise.all)で高速化- 部署内の有効ユーザーだけまとめて非同期処理
- 実務で使えるパターン
- バッチ処理: 部署ごとのデータを条件付きで処理
- API呼び出しや DB 保存など重い処理の回数を減らす
- 部署単位でスキップできるので無駄な処理が発生しない
💡 応用アイデア:
- 部署単位でログやレポート作成
- 条件外ユーザーを別配列に集めて監査用に保持
- 条件変更時に処理を変えたい場合でもフラグ管理で対応可能
