Skip to content

並行処理

コールバックではなくプロミスを使用する

コールバックは可読性が低く過剰なネストを引き起こします。ES2015/ES6ではプロミスがグローバルな組み込み型として組み込まれています。プロミスを使用すべきです。

悪い例:

javascript
import { get } from "request";
import { writeFile } from "fs";

get(
  "https://en.wikipedia.org/wiki/Robert_Cecil_Martin",
  (requestErr, response, body) => {
    if (requestErr) {
      console.error(requestErr);
    } else {
      writeFile("article.html", body, writeErr => {
        if (writeErr) {
          console.error(writeErr);
        } else {
          console.log("File written");
        }
      });
    }
  }
);

良い例:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
  .then(body => {
    return writeFile("article.html", body);
  })
  .then(() => {
    console.log("File written");
  })
  .catch(err => {
    console.error(err);
  });

Async/Awaitはプロミスよりもさらに簡潔

プロミスはコールバックに対して非常に簡潔な代替手段ですが、ES2017/ES8ではasync/awaitというさらに簡潔なソリューションが登場しました。必要なのは関数にasyncキーワードを付与するだけで、thenチェーンを使わずに命令型のロジックを記述できます。ES2017/ES8の機能を使用可能な場合は、この機能を活用してください。

悪い例:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
  .then(body => {
    return writeFile("article.html", body);
  })
  .then(() => {
    console.log("File written");
  })
  .catch(err => {
    console.error(err);
  });

良い例:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

async function getCleanCodeArticle() {
  try {
    const body = await get(
      "https://en.wikipedia.org/wiki/Robert_Cecil_Martin"
    );
    await writeFile("article.html", body);
    console.log("File written");
  } catch (err) {
    console.error(err);
  }
}

getCleanCodeArticle()