티스토리 뷰

참고했던 내용 : http://programmingsummaries.tistory.com/325


사내 재고부족메시지를 개선하기 위해 api를 수정해야했다.


(기존 메시지) 어떤메뉴가 부족한지 몇개가 부족한지 나오지않았다, -> 재고가 부족합니다.

(바꾸려는 메시지) 현재, (음식)의 재고가 (x)개 부족합니다. 다시주문해 주시기 바랍니다.

아래 함수가 재고를 체크하는 함수였다.


function isAvailableAdjustOrdereds(menuDailys, menuInfos) {
 return menuInfos.every((menuInfo) => {
   const menuDaily = menuDailys[_.findIndex(menuDailys, md => md.menuIdx === menuInfo.idx)];
   if (!menuDaily) return false;
   if (menuDaily.remain < menuInfo.amount) return false;
   return true;
});
}

every 함수는 아래와 같이, 모든 배열들의 조건을 체크해서 모든 배열이 그조건을 통과하느냐 아니냐에 따라

True,false 값을 return해주는 함수이다.


[1,2,3].every((a) => a > 0). === true
[1,2,3].every((a) => a > 1) === false

괜히 기존함수를 사용하는것이 좋다 생각하여, 이를 활용해 , 맨 처음엔 foreach 함수와 같이 모든 배열에 접근하는 것을 사용하려 every함수를 사용했었다…ㅎ boolean값을 리턴해주고있었는데, 그값을 프로미스 객체로 리턴해서 메시지에 출력하려는 방식으로 출력하려 했었으니 잘못된 방식이었던것이다. 메시지내용이 return 될수없는 구조로 짜고있었던 것이다.


async function isAvailableAdjustOrderedMenus(menuDailys, menuInfos) {
 let notAvailableMenus = '';
 var result = menuInfos.every(async (menuInfo) => {
   const menuDaily = menuDailys[_.findIndex(menuDailys, md => md.menuIdx === menuInfo.idx)];
   if (menuDaily.remain < menuInfo.amount) {
     const notAvailable = await getMenuDetail(menuDaily.menuIdx);
     notAvailableMenus += notAvailable.name.korean;
     console.log(notAvailableMenus);
  }
});
 return result;
}

따라서, foreach promise 란 키워드로 검색해보면서, foreach를 돌면서 변수에 부족한 메뉴와 갯수들의 메시지를 담아주고, 모든 for each문을 다 돌았을때 Promise.all(promises)를 통해, forEach를 돌면서 resolve 된 promise를 모두 담아서 재고부족 정보와 관련된 메시지를 담은 객체를 return해주는 방식으로 수정해주었다.


function isAvailableAdjustOrderedMenus(menuDailys, menuInfos) {
 let notAvailableMenus = '';
 let notAvailable = '';
 const promises = [];

 menuInfos.forEach(async (menuInfo) => {
   promises.push(new Promise(async (resolve, reject) => {
     const menuDaily = menuDailys[_.findIndex(menuDailys, md => md.menuIdx === menuInfo.idx)];
   // 재고를 체크하여 notAvailableMenus에 계속 붙여줌
     if (menuDaily.remain < menuInfo.amount) {
       notAvailable = await getMenuDetail(menuDaily.menuIdx);
       notAvailableMenus += `${notAvailable.name.korean}: ${menuDaily.remain}개 남음\n`;
    }
     resolve(notAvailableMenus);
  }),
  );
});
 return Promise.all(promises);
}

아래와 같이 위의 함수를 호출하게 되면 resolve 된 프로미스 객체가 담긴 배열이 message에 담기게 된다. 이메시지를 출력해주는 방식으로 수정해주었다.


const message = await Service.MenuDaily.isAvailableAdjustOrderedMenus(menuDailys, menuInfos);

async await을 예전에 확실한 이해없이 썼었던 것 같아서, 다시 공부해야 겠다는 생각이 들었다. 또한 이 기회에 promise에 대한 개념을 다시잡아보는 계기가 되었고, 위의 재고부족체크 함수를 현재는 promise로 짜보았지만 다시 async await으로 깔끔히 짜볼 예정이다. 일단 고질병인 변수이름 정하는 것도 연습을 해봐야겠다...

'Back end > Node.js' 카테고리의 다른 글

Node.js - 로컬에서 서버띄우기, node.js와 package.json  (0) 2018.07.11
Node.js - forEach with delay  (0) 2018.04.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함