동시성
콜백 대신 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()