https://maximorlov.com/linting-rules-for-asynchronous-code-in-javascript/
위의 링크는 ESLint 규칙을 추가하는 것을 권유하는 글이지만
그냥 추가하기보단 하나하나 왜 그런지 이해해보고 분석해볼거임.
new Promise 생성자에 async함수를 전달하지 말자
- async 함수에서 던진 에러는 reject 되지 않는 걸 볼 수 있음.
- new Promise 생성자 내부에서 await를 사용하게 될 경우에 Promise 랩핑을 제거할 수 있음.
반복문에서 await 구문을 사용하지 말자.
반복문내의 함수가 꼭 순서대로 실행되어야 하는경우가 아니면
병렬적으로 함수를 실행시킴으로써 효율성이 크게 향상됨.
아무튼 계속 아래의 경우가 시간이 더 빠름
promise 생성자 내에서 반환한 값은 사용할 수 없음.
항상 resolve, reject 체결해야함.
출력: Post count: 5 (or 3)
원하는 출력은 8일 것임.
async function addPosts(userId){
const posts = await getPosts(userId);
totalPosts += posts;
}
값을 읽어들이는 시간과 변수에 업데이트 하는 시간의 차이가 존재해서
위의 코드는 값을 읽어오기를 완료했을 때 값이 0인 totalPosts에 업데이트를 하게 됨.값을 읽어오기 / 업데이트를 분리해줘야함.
콜백지옥, 가독성 안좋고 유지보수 불편함.
async 함수에서 리턴은 Promise로 반환되기 때문에 기다렸다가 즉시반환 을 할 필요가 없다.
try/catch 에서는 await을 제거하면 promise reject 를 캐치할 수가 없기 때문에 await이 필요함.
- 이경우 에서는 의도를 명확히 하기 위해 변수에 담아서 리턴하는게 좋다.
reject할 때는 Error 객체 사용을 하는게 좋다.
Error 객체의 스택 정보를 얻을 수 있어서 오류가 발생한 위치를 더욱 쉽게 찾을 수 있다.
아래는 Node 규칙
node.js 에서는 콜백함수의 첫번째 매개변수를 err 로 하는게 일반적
오류 처리를 잊으면 안됨.
Error 객체를 첫 번째 매개변수로 하여 콜백 함수 호출해야함.
오류가 없을 경우 null 이나 undefined 를 넣음.
동기 메소드 차단.
nodejs 에선 동기함수를 사용하면 이벤트 루프가 차단됨.
아래는 타입스크립트 사용자를 위한 규칙
promise가 아닌 함수나 값을 기다리지 않기.
항상 promise reject 를 처리해야한다.
if 조건문에서 await 는 가능하지만 가독성을 높이기 위해 변수로 처리.
Error 객체를 throw 하거나 reject된 promise 를 리턴할 때
두 시나리오 모두 처리해야함.
promise를 반환하는(비동기) 함수는 모두 async 처리르 함으로 가독성을
높인다.