본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js

Node.js 반복문에서의 동기화, bluebird

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 28.

 

 

노드.js는 이벤트 루프방식으로 동작하는 언어라..작업이 좀 걸린다 싶은(?) 느낌의 작업은 기다려주지 않고 던저버리는 경우가 일쑤이다.

가령, 반복문에서 어떠한 작업을 하고 있는데..해당 반복문이 끝나고 결과값을 가지고 데이터를 처리하는 행위를 해야되는데..노드에서 해당 작업을 기다려주지 않고 지나가는(?) 경우가 많다.

이를 극복하기 위해서 Promise나 async, await등 여러 방법이 존재하지만, 이러한 프로세스를 반복문에서 막상 적용시키려면..조금 복잡하고 어렵다. 구글링을 해도 잘 되지도 않는 것 같고..

아무튼, 좋은 방법중 하나로는 bluebird 라는 모듈을 설치하면 쉽게 처리 할 수 있다.

먼저 모듈을 설치한다.

npm install bluebird

http://bluebirdjs.com/docs/getting-started.html

 

var list = ['abcd','efg','hijk','lmn'];  //list라는 배열을 가정하자.
const PROMISE = require("bluebird"); //블루버드라는 모듈을 설치 후 가져온다.
var prom = list.map((item)=>{  //map은  배열에서 값을 재 조립하는 역할을 한다.
     return new Promise((resolve,reject)=>{
         if(true){   //사용자가 원하는 조건
             resolve('결과 : ' + item);  //해당 resolve에 원하는 값을 넣자.
         } else{
             reject('error'); 
         }
     });
});

PROMISE.all(prom).then((result)=>{
    console.log(result);  //해당 result에 결과가 존재한다.
}).catch((error)=>{
    console.log(error);
});

이를 응용해서..어떠한 서버가 존재하고, 만약 데이터 베이스에 결과 조회 또는 삽입, 수정 및 삭제 같은 프로세스가 반복문 내부에서 진행이 되어야 한다면 위 코드에서 "사용자가 원하는 조건"에 로직을 삽입하면 된다.

아래는 개념적인 내용을 기술한 코드이다. * 동작은 하지 않는다

 

//express 서버를 사용한다 가정하고
router.all('/', function (req, res) {
    const list = ['abcd','efg','hijk','lmn'];  //list라는 조회할 배열을 가정하자.
    const array = new Array();  //사용자에게 전달 할 배열이라 가정하자.
    var prom = list.map((item)=>{   //반복문이 완료 될 때 까지 promise에 의해서 기다린다.
        return new Promise((resolve,reject)=>{ 
            //데이터베이스를 조회한다.
            db.query('select * from test where a=? and b=?', [req.body.param, item]).then((val)=>{
                array.push(val);  //조회한 결과를 담는다.
                resolve('OK');    
            }).catch((error)=>{
                console.log(error);
                reject(error);
            });   
        });
    });
    PROMISE.all(prom).then((result)=>{  //모든 행위가 끝나면 응답.
        res.json(array);    
    }).catch((error)=>{
        console.log(error);
        res.json({result:'FAIL'});
    });
});
반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글