2017-11-27 17 views
-1

에 대한 2 개의 시퀀셜 쿼리 실행 아래 코드는 작동하지만 나는 그것이 끔찍하고 유지 보수가 불가능하다는 것을 알고 있습니다.노드 비동기 - 객체 배열

날짜 배열이 있는데 데이터베이스에 다음 번호를 생성하는 첫 번째 쿼리와 데이터베이스에 새 이벤트를 삽입하는 두 번째 쿼리를 실행해야합니다.

더 나은 코드로 어떻게이 루틴을 수행 할 수 있습니까? 비동기/대기 (es7) 또는 약속 또는 콜백을 사용할 수 있다고 생각합니다.

const async = require('async') 

function Reschedule(){ 

this.createEvent = function(req, res, next){ 
    req.DesiredDate = req.DesiredDate.filter(e=>e.Available) 
    // req.DesiredDate = [{},{},{}.....] objects with date property desired 
    async.forEachSeries((req.DesiredDate), function (item, callback){ 

     conn.acquire(function(err,con){ 
     con.query('SELECT EventID, EventCode FROM event WHERE YEAR(StartEvent) = YEAR(?) order by eventId desc limit 1', [item.dateStart], function(err, result) { 
      con.release(); 
      if(err){ 
      console.log(err); 
      res.render('error', { error: err }); 
      }else{ 


//Get new Number of EVENT 

      let eventCode = result.length === 0 ? parseInt(moment(item.dateStart).year() + '0001') : result[0].EventCode + 1 
      console.log('proximo codigo: ' + eventCode) 

      let newEvent = { 
       Type: 'I', 
       EventCode: eventCode, 
       StartEvent: item.dateStart, 
       EndEvent: item.dateEnd, 
       Room_ID: req.findEventByCode.RoomID, 
       Name: req.findEventByCode.title 
      } 

// after get new number in query above, then create new event 

      conn.acquire(function(err,con){ 
       con.query('INSERT INTO Event SET ?', [newEvent], function(err, result) { 
       con.release() 
       if(err) { 
        console.log(err) 
        res.render('error', { error: err }) 
       } else { 
        console.log('created new event ' + eventCode); 
        callback() 
       } 
       }) 
      }) 
      } 
     }) 
     }) 
    }, function(err) { 
     next() 
    }) 
    } 
} 
module.exports = new Reschedule() 

답변

0

자바 스크립트 약속과 비동기의 요점은 무엇인가하고 완료되면, 당신은 기다릴 필요없이 응답과 함께 일을 할 것입니다.

function get_event(){ 
    //this functions gets data 
    return "Some data"; 
} 

function create_event(data){ 
    //function that does something 
    var do_something = (d) => { 
    console.log(d); 
    return true; 
    } 
    //return that function 
    return do_something(data); 
} 

async function query(){ 
    //execute as async 
    return await create_event(get_event()); 
} 


query().then((callback_data) => { 
    //do stuff with callback data 
    console.log(callback_data); //prints true 
}); 

우리가 과잉 가고 싶은 경우 (권장하지 않음) : 그래서 좋은 예는 수

async function get_event(){ 
    //this functions gets data 
    return "Some data"; 
} 

async function create_event(data){ 
    //function that does something 
    var do_something = (d) => { 
    console.log(d); 
    return true; 
    } 
    //return that function 
    return await do_something(data); 
} 

async function query(){ 
    //execute as async 
    return await get_event().then((data) => { 
    return create_event(data).then((callback_data) => { 
     return callback_data; 
    }); 
}); 
} 


query().then((callback_data) => { 
    //do stuff with callback data 
    console.log(callback_data); //prints true 
}); 

그래서 내가 별도의 기능으로 작업을 분할과 함께 전화를 추천합니다 비동기 함수에서.

참고 : 코드를 쉽게 유지 관리하는 것이 목표 인 경우.