marpple/FxJS

비동기 처리 질의 드립니다.

wjd6542 opened this issue · 2 comments

인프런 강의 시청이후 테스트 코드 짜서 예제 풀어보는 식으로 해보고있습니다
하지만 처리된 결과가 함수형 프로그래밍 방식으로 제대로 처리된것인지 의문이들어서
코드 리펙토링 좀 부탁드리려 합니다

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);
})();

안녕하세요. fxjs에 관심 가져 주셔서 감사합니다. 비교적 간단한 코드라 현재 상태도 굳이 개선할 필요가 없다고 생각하지만 사소한 것이라도 코멘트 해드리자면

// return [...await familyList, ...await userList];
return familyList.concat(userList);

이 코드에서 familyListuserList가 이미 Promise가 아닌 배열이기 때문에 await을 할 필요가 없습니다.
그리고 L.map을 사용했지만 deepFlat으로 반드시 iterable을 모두 평가하기 때문에 지연 평가의 이점이 없다고 생각됩니다.
마지막으로 유저 리스트와 가족 리스트를 각각 순회하지 않고 아래와 같이 한 번에 순회하여 처리할 수 있습니다.
https://codesandbox.io/s/sad-napier-wxsy8?file=/src/index.js

도움이 되셨으면 좋겠네요 🙂

저는 필터링 을 2번 했는데 위 예제는 1번이면 끝나는군요 많이 배웁니다
답변 감사드리며 앞으로 많은 도움 부탁 드리겠습니다.