Skip to content

동시성

콜백 대신 Promise(프로미스) 사용

콜백은 코드를 복잡하게 만들고 과도한 중첩을 유발합니다. ES2015/ES6부터 Promise가 내장 전역 타입으로 제공되므로 이를 활용하세요!

나쁜 예:

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는 Promise보다 더 깔끔한 방식

Promise는 콜백 대비 깔끔한 대안이지만, 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()