[JS,TS,NodeJS] 비동기 코드 작성 규칙

이준규·2022년 4월 28일
0

자바스크립트

목록 보기
3/6
post-thumbnail

https://maximorlov.com/linting-rules-for-asynchronous-code-in-javascript/

위의 링크는 ESLint 규칙을 추가하는 것을 권유하는 글이지만

그냥 추가하기보단 하나하나 왜 그런지 이해해보고 분석해볼거임.


1. no async promise executor

new Promise 생성자에 async함수를 전달하지 말자

  1. async 함수에서 던진 에러는 reject 되지 않는 걸 볼 수 있음.
  2. new Promise 생성자 내부에서 await를 사용하게 될 경우에 Promise 랩핑을 제거할 수 있음.

2. no await in loop

반복문에서 await 구문을 사용하지 말자.

반복문내의 함수가 꼭 순서대로 실행되어야 하는경우가 아니면
병렬적으로 함수를 실행시킴으로써 효율성이 크게 향상됨.

아무튼 계속 아래의 경우가 시간이 더 빠름


3. no promise executor return

promise 생성자 내에서 반환한 값은 사용할 수 없음.
항상 resolve, reject 체결해야함.


4. require atomic updates

출력: Post count: 5 (or 3)

원하는 출력은 8일 것임.

  • 해결법

addPosts 함수를 수정해야함.

async function addPosts(userId){
  const posts = await getPosts(userId);
  totalPosts += posts;
}

값을 읽어들이는 시간과 변수에 업데이트 하는 시간의 차이가 존재해서
위의 코드는 값을 읽어오기를 완료했을 때 값이 0인 totalPosts에 업데이트를 하게 됨.값을 읽어오기 / 업데이트를 분리해줘야함.


5. max nested callbacks

콜백지옥, 가독성 안좋고 유지보수 불편함.


6. no return await

async 함수에서 리턴은 Promise로 반환되기 때문에 기다렸다가 즉시반환 을 할 필요가 없다.

예외) try...catch 있을 때

try/catch 에서는 await을 제거하면 promise reject 를 캐치할 수가 없기 때문에 await이 필요함.

  • 이경우 에서는 의도를 명확히 하기 위해 변수에 담아서 리턴하는게 좋다.

7. prefer promise reject errors

reject할 때는 Error 객체 사용을 하는게 좋다.
Error 객체의 스택 정보를 얻을 수 있어서 오류가 발생한 위치를 더욱 쉽게 찾을 수 있다.


아래는 Node 규칙

8. node/handle callback error

node.js 에서는 콜백함수의 첫번째 매개변수를 err 로 하는게 일반적

오류 처리를 잊으면 안됨.

9. node/no callback literal

Error 객체를 첫 번째 매개변수로 하여 콜백 함수 호출해야함.

오류가 없을 경우 null 이나 undefined 를 넣음.

10. node/no sync

동기 메소드 차단.

nodejs 에선 동기함수를 사용하면 이벤트 루프가 차단됨.


아래는 타입스크립트 사용자를 위한 규칙

11. typescript/await thenable

promise가 아닌 함수나 값을 기다리지 않기.


12. typescript/no floating promises

항상 promise reject 를 처리해야한다.

13. typescript/no misused promises

if 조건문에서 await 는 가능하지만 가독성을 높이기 위해 변수로 처리.

14. typescript/promise function async

Error 객체를 throw 하거나 reject된 promise 를 리턴할 때
두 시나리오 모두 처리해야함.
promise를 반환하는(비동기) 함수는 모두 async 처리르 함으로 가독성을
높인다.

profile
백엔드

0개의 댓글