mcpField
A
async-patterns

async-patterns

github.com/pluginagentmarketplace開発297 回インストール44 週間前に更新
リポジトリ

async-patterns について

async-patternsは、Node.js開発者向けにJavaScriptのコールバック、Promise、async/awaitを扱う学習スキルです。エラー処理、並行制御、ストリーム、イベント駆動プログラミングも取り上げます。

主な機能

  1. 01コールバック、Promise、async/await
  2. 02逐次・並列タスク処理
  3. 03Promiseの合成メソッド
  4. 04非同期エラー処理とリトライ
  5. 05並行数制限、ストリーム、イベントエミッター

活用シーン

  1. 01Node.js非同期プログラミングの基礎学習
  2. 02ファイル・ネットワーク・DBのI/Oを並行処理
  3. 03非同期処理のエラー回復方法を設計
  4. 04ストリーム処理とバックプレッシャー管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-nodejs --skill async-patterns

インストール後、Claude Code で/async-patternsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
config.yaml
references/
GUIDE.md
scripts/
helper.py

詳細

非同期プログラミングパターンのスキル

非同期プログラミングを習得しましょう。これは Node.js のパフォーマンスとスケーラビリティの基盤です。

クイックスタート

非同期 JavaScript の3つの柱:

  1. コールバック - 従来のパターン(エラーファースト)
  2. Promise - モダンなチェーン可能パターン
  3. Async/Await - 同期コードのように見える非同期コード

基本パターン

コールバック → Promise → Async/Await の進化
// 1. Callbacks (old way)
fs.readFile('file.txt', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 2. Promises (better)
fs.promises.readFile('file.txt')
  .then(data => console.log(data))
  .catch(err => console.error(err));

// 3. Async/Await (modern)
async function readFile() {
  try {
    const data = await fs.promises.readFile('file.txt');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}
逐次実行と並列実行
// ❌ Slow: Sequential (300ms total)
async function slow() {
  const a = await fetch('/api/a'); // 100ms
  const b = await fetch('/api/b'); // 100ms
  const c = await fetch('/api/c'); // 100ms
  return [a, b, c];
}

// ✅ Fast: Parallel (100ms total)
async function fast() {
  const [a, b, c] = await Promise.all([
    fetch('/api/a'),
    fetch('/api/b'),
    fetch('/api/c')
  ]);
  return [a, b, c];
}
Promise メソッド
// Promise.all - Wait for all (fails if one fails)
const [users, posts] = await Promise.all([getUsers(), getPosts()]);

// Promise.allSettled - Wait for all (never fails)
const results = await Promise.allSettled([fetch1(), fetch2(), fetch3()]);

// Promise.race - First to complete
const fastest = await Promise.race([server1(), server2()]);

// Promise.any - First to succeed
const result = await Promise.any([tryAPI1(), tryAPI2()]);

学習パス

初級(1~2週間)
  • ✅ イベントループを理解する
  • ✅ コールバックを習得する
  • ✅ Promise の基礎を学ぶ
  • ✅ async/await を練習する
中級(3~4週間)
  • ✅ エラー処理のパターン
  • ✅ 逐次実行と並列実行
  • ✅ Promise の合成
  • ✅ イベントエミッター
上級(5~6週間)
  • ✅ ストリームとバックプレッシャー
  • ✅ 並行処理の制御
  • ✅ サーキットブレーカー
  • ✅ パフォーマンスの最適化

よく使われるパターン

エラー処理
// Try/catch for async/await
async function safeOperation() {
  try {
    const result = await riskyOperation();
    return { success: true, data: result };
  } catch (error) {
    console.error('Operation failed:', error);
    return { success: false, error: error.message };
  }
}

// Process-level handlers
process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Rejection:', reason);
});
指数バックオフによる再試行
async function retryWithBackoff(fn, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      const delay = Math.pow(2, i) * 1000;
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}
並行処理数の制限
async function batchProcess(items, concurrency = 5) {
  const results = [];
  for (let i = 0; i < items.length; i += concurrency) {
    const batch = items.slice(i, i + concurrency);
    const batchResults = await Promise.all(
      batch.map(item => processItem(item))
    );
    results.push(...batchResults);
  }
  return results;
}

ストリーム

const { pipeline } = require('stream');
const fs = require('fs');

// Efficient file processing
pipeline(
  fs.createReadStream('input.txt'),
  transformStream,
  fs.createWriteStream('output.txt'),
  (err) => {
    if (err) console.error('Pipeline failed:', err);
    else console.log('Pipeline succeeded');
  }
);

イベントエミッター

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();

emitter.on('event', (data) => {
  console.log('Event fired:', data);
});

emitter.emit('event', { id: 123 });

使用する場面

次のような場合に非同期パターンを使用します:

  • I/O 操作(ファイル、ネットワーク、データベース)の処理
  • スケーラブルな Node.js アプリケーションの構築
  • 複数の並行処理の管理
  • データストリームの処理
  • イベント駆動型アーキテクチャの作成

関連スキル

  • Express REST API(非同期ルートハンドラー)
  • データベース統合(非同期クエリ)
  • テストとデバッグ(非同期コードのテスト)
  • パフォーマンス最適化(非同期パフォーマンス)

リソース

コメント