비동기 처리 질의 드립니다.
wjd6542 opened this issue · 2 comments
wjd6542 commented
인프런 강의 시청이후 테스트 코드 짜서 예제 풀어보는 식으로 해보고있습니다
하지만 처리된 결과가 함수형 프로그래밍 방식으로 제대로 처리된것인지 의문이들어서
코드 리펙토링 좀 부탁드리려 합니다
const log = console.log;
const {L}= ;
log()
// 데이터 리스트 Promise 로 구성된 실전같은 Test data
const list = [
Promise.resolve({id: 1, name : "강성재", age : 30, gender : '남자', height: 180, status : "사용",
family : [
Promise.resolve({id: 2, name : "강성화", age : 37, gender : '여자', height: 145, status : "미사용"}),
Promise.resolve({id: 2, name : "강성진", age : 35, gender : '남자', height: 185, status : "사용"}),
]}),
Promise.resolve({id: 2, name : "김나은", age : 31, gender : '여자', height: 145, status : "미사용",
family : [
Promise.resolve({id: 2, name : "김나우", age : 18, gender : '남자', height: 195, status : "미사용"}),
Promise.resolve({id: 2, name : "김나나", age : 22, gender : '여자', height: 175, status : "사용"}),
Promise.resolve({id: 2, name : "김나자", age : 25, gender : '여자', height: 165, status : "미사용"}),
]}),
Promise.resolve({id: 2, name : "강진우", age : 31, gender : '여자', height: 145, status : "미사용",
family : [
Promise.resolve({id: 2, name : "강상호", age : 45, gender : '남자', height: 195, status : "미사용"}),
Promise.resolve({id: 2, name : "강상화", age : 25, gender : '여자', height: 175, status : "사용"}),
Promise.resolve({id: 2, name : "강상주", age : 23, gender : '여자', height: 165, status : "미사용"}),
]}),
];
// 12. 성이 강씨인 유저, 가족 검색
async function f(iter, obj){
const myRe = obj.myRe;
// 유저 필터
const filterUser = _.filter((user) => myRe.test(user[obj.key]));
// 유저 리스트
const userList = await filterUser(iter);
// 가족리스트
const familyList = await _.go(
iter,
L.map((u) => u.family),
_.deepFlat,
filterUser,
);
// 유저와 가족의 배열을 합친다
return [...await familyList, ...await userList];
}
// 비동기 순차실행
(async ()=>{
let arr = await f(list, {
myRe : /^강/,
key : "name"
});
log(arr);
})();
shine1594 commented
안녕하세요. fxjs에 관심 가져 주셔서 감사합니다. 비교적 간단한 코드라 현재 상태도 굳이 개선할 필요가 없다고 생각하지만 사소한 것이라도 코멘트 해드리자면
// return [...await familyList, ...await userList];
return familyList.concat(userList);
이 코드에서 familyList
와 userList
가 이미 Promise가 아닌 배열이기 때문에 await을 할 필요가 없습니다.
그리고 L.map을 사용했지만 deepFlat으로 반드시 iterable을 모두 평가하기 때문에 지연 평가의 이점이 없다고 생각됩니다.
마지막으로 유저 리스트와 가족 리스트를 각각 순회하지 않고 아래와 같이 한 번에 순회하여 처리할 수 있습니다.
https://codesandbox.io/s/sad-napier-wxsy8?file=/src/index.js
도움이 되셨으면 좋겠네요
wjd6542 commented
저는 필터링 을 2번 했는데 위 예제는 1번이면 끝나는군요 많이 배웁니다
답변 감사드리며 앞으로 많은 도움 부탁 드리겠습니다.