프로미스의 마지막 포스팅으로 병렬처리에 관해 알아보자. 프로그래머의 역량을 알고 싶을 때 두 가지 부분을 질문하면 된다. 첫 번째는 '예외 구문처리' 두 번째는 '병렬 처리'다. 예외 구문을 제대로 처리하지 않으면 디테일이 사라진다. 훌륭한 제품이나 서비스는 항상 디테일이 살아있다. 예외 구문은 디테일을 위해서 반드시 필요한 작업이다.
그리고 병렬 처리는 효율성이다. 만일 소프트웨어라는 생명체가 욕구를 갖고 있다면 그것은 효율성일 것이다. 프로그램은 효율을 지향한다. 아마추어와 중급 프로그래머의 차이는 효율성에 있다. 직렬로 수십줄 이어붙인 코드는 병렬처리로 10줄 안에 끝날 수 있다. 프로미스는 효율적인 면에서 상당히 중요하다. 프로미스 구문의 마지막 포스팅으로 병렬처리에 관해 알아보자.
1 프로미스::병렬처리
병렬처리에 앞서 아래와 같은 직렬식 프로미스 구문을 살펴보자.
function barista(name, mymoney){ return new Promise(function(resolve,reject){ let coffee = prompt('커피를 주문하세요'); let list = ['아메리카노','카푸치노','카페모카','카페라떼']; /① let items = []; //② var possible = {}; //③ for(let i=0; i<list.length; i++){ if(coffee === list[i]){ possible.coffee = coffee; possible.name = name; items.push(possible); //④ } } resolve(items); //⑤ reject(`에러발생`)
}) } Promise.all([ //⑥ barista("은지",5300), barista("병헌", 4800), barista("동원",5100) ]).then(function(result){ console.log(result); for(let i=0; i<result.length; i++){ if(result[i][0]){ console.log(result[i][0].coffee); //⑦ }else{ console.log("해당커피는 목록에 없습니다") } } }).catch(function(err){ console.log(err); }) |
위의 코드를 사용자 입장에서 정의하자면, 바리스타에게 커피를 주문하는 상황이다. 사용자는 '아메리카노' , '카푸치노', '카페모카' , '카페라떼'중①에서 주문할 수 있다. list배열에 주문가능한 커피를 넣고, items배열을 만들자. items배열의 각 인덱스에는 주문자와 관련된 정보가 객체로 저장된다.③
items배열에 객체를 추가할 때는 ④처럼 push메서드를 사용한다. 첫번째 for구문에서는 사용자가 주문한 커피가 리스트에 있는 커피인지 확인한 뒤 items배열 데이터로 추가하는 기능이 담겨 있다.(Promise없음) 두 번째 for-in문에서는 items배열에 객체가 있을 경우에 resolve()구문으로 items[item](객체)데이터를 전달(then메서드)한다.⑤
Promise.all([ 프로미스객체1, 프로미스객체2, .....]).then().catch()구문에서는 한꺼번에 프로미스 객체(barista())들을 계산할 수 있다.⑥
병렬을 활용하면, then()메서드를 하나만 사용해서 여러개의 프로미스 객체들의 결과값을 도출할 수 있다. ⑦ 위의 코드를 실행하면 prompt입력창이 3회 실행되고, 입력한 커피와 주문자 데이터는 console값으로 볼 수 있다.
2 Promise.race메서드
Promise.race()메서드는 Promise객체에서 가장 먼저 종료한 결과만 다음 작업으로 보낸다. Promise.all([])에서 race만 변경해보자.
function barista(name, mymoney){ return new Promise(function(resolve,reject){ let coffee = prompt('커피를 주문하세요'); let list = ['아메리카노','카푸치노','카페모카','카페라떼']; let items = []; var possible = {}; for(let i=0; i<list.length; i++){ if(coffee === list[i]){ possible.coffee = coffee; possible.name = name; items.push(possible); } } resolve(items); reject(`에러발생`) }) } Promise.race([ barista("은지",5300), barista("병헌", 4800), barista("동원",5100) ]).then(function(result){ console.log(result); //① }).catch(function(err){ console.log(err); }) |
①의 결과는 배열 첫번째 값이다. '은지', '병헌' ,'동원'의 값을 병렬로 입력했지만 '은지'의 값만 반환된다. 선착순으로 모집하는 프로그램에서 Promise.race([])를 사용한다면 편리하지 않을까한다.(그렇게 많이 사용될 것 같지 않다)
Promise.race([])가 있다는 정도로 알아두면 될 듯하다.
'코드 스터디' 카테고리의 다른 글
책추천 「객체지향 사실과 오해 (1)」상태 | 행동 | 캡슐화 |식별자 (0) | 2019.08.27 |
---|---|
Ⅰ「객체지향의 사실과 오해」저자 조영호|위키북스 |2015 (0) | 2019.08.27 |
자바스크립트 심화(13) 프로미스 비동기 실행 (0) | 2019.06.25 |
자바스크립트 심화(12) promise 기본 사용법 (2) | 2019.06.24 |
[인문학 코딩] 코딩문법을 실전에 사용할 수 있는 방법 (0) | 2019.06.19 |
댓글