async/await 구문 내에서 Array.filter 구문을 사용할 수 없다는 걸 알게 되고 찾아본 코드
.filter 뿐만 아니라 다양한 메소드 및 키워드들이 비동기 처리 구문 내에서 활용이 안되는 것 같다.
필요해서 갖다 써 놓고 이해가 가지 않는 코드에 대해 뜯어보는 중이다.
온전히 이해하려면 JS의 비동기식 프로그래밍, Promise 객체, async/await 그리고 Symbol 타입까지 알아봐야함.
일단은 써놓고 어떻게 돌아가는지도 파악 못하는 건 우습기 때문에 사용한 부분이라도 알아본다.
해당 파트의 구조.
1. asyncFilter 함수를 정의한다. 이 함수의 기능은 아래와 같다.
Promise.all 구문을 이용해 인자로 주어진 원본배열의 모든 요소를 순회한다.
이때 Promise.all을 사용할 수 있는 것은
asyncFilter의 callback 함수에 포함된 doAsyncStuff 함수가
배열 요소 하나를 순회할 때마다 매번 Promise를 반납해주기 때문이다.
순회하면서 .map 메소드를 이용해 새로운 배열을 생성하는데
1) 현재 순회중인 배열의 요소가 조건식을 충족할 경우 그 값을 배열에 넣고
2) 조건식에 맞지 않다면 변수 fail에 정의한 임의의 값, Symbol 을 배열에 넣는다.
(*이렇게 하는 이유는 .map 메서드의 특성 때문임. 원본 배열과 동일한 length의 배열을 리턴)
*이때 조건식은 callback 함수로 불러들인다는 점, 그 문법의 사용도 잘 살펴보자.
3) 그리고 이 배열을 "리턴할 때"
.filter를 붙여서 Symbol 값이 들어간 부분들을 제외한
즉 의도한 조건식에 맞는 요소들만으로 구성된 배열을 반납한다.
2. doAsyncStuff 함수는 단순히 어떤 비동기 처리 행위를 해서 Promise를 반납하기 위해 정의한 함수이다.
(아마도 이 부분에선 어떤 것이든 Promise를 반환하는 키워드를 채워 넣으면 될 것 같다?)
3. asyncFilter 라는 함수를 호출하면서 인자로 아래의 2가지를 넣는다.
1) filter할 원본 배열 (all_comments)
2) 콜백 함수 - doAsyncStuff를 실행한 뒤 filtering의 조건식을 반환함.
그리고 이 asyncFilter 함수의 리턴값은 filtered_comments 라는 변수 (배열)에 할당한다.
이 글을 쓰는 중에 이해가 됨 오호
// 댓글 조회 API (no login)
router.get("/comment/:articleId", async (req,res) => {
const { articleId }= req.params;
const all_comments = await Comments.find();
//여기부터
// 3. asyncFilter 함수를 호출하며 원본 배열과 콜백함수를 인자로 넣어준다.
// 이 때 콜백함수는 doAsyncStuff() 함수를 호출하고, filtering의 조건식을 반환한다.
const filtered_comments = await asyncFilter(all_comments , async item => {
await doAsyncStuff()
return item["location"] == Number(articleId)
})
// 2. Promise를 반환하기 위한 함수를 정의한다.
function doAsyncStuff() {
return Promise.resolve()
}
// 1. asyncFilter 함수를 정의한다. 필터링의 과정은 본문에.
async function asyncFilter(arr, callback) {
const fail = Symbol()
return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i=>i!==fail)
}
//여기까지 잘 뜯어보기
function compare (key) {
return (a, b) => (Date.parse(a[key]) < Date.parse(b[key]) ? 1 : (Date.parse(a[key]) > Date.parse(b[key]) ? -1 : 0));
}
const comments = filtered_comments.sort(compare("date"));
res.json({
comments
});
});'항해99 > 4주) Node.js 숙련' 카테고리의 다른 글
| 항해99 4주차 중 / 튜터링 질문 "현재의 우선순위" (0) | 2022.06.01 |
|---|---|
| mongoose-auto-increment 사용 중지할 것, npm, package.json (0) | 2022.05.30 |
| 정규표현식 (0) | 2022.05.30 |
| 현타씨게옴 (0) | 2022.05.28 |
| 4주차 Node.js 숙련 첫날의 의문과 이주의 방향성 세팅 (0) | 2022.05.27 |