0

작은 응용 프로그램을 작성 중이며 콜백 패턴을 사용하는 대신 DB와 통신하며 약속을 사용하여 코드를 간소화합니다. 공정한 양의 코딩을 수행 한 후에는 코드에서 매우 자주 패턴을 볼 수 있으므로 비슷한 논리가 한 곳에서 발생하도록 리팩터링 할 수 있어야합니다.자바 스크립트의 리팩터링 패턴

var queryString = "select * from users u inner join "+ 
     "(select user_id, count(id) cnt from applications "+ 
     "where id in (select id from applications where "+ 
     "created_at > current_date - interval '1 week') "+ 
     "group by user_id) a on u.id = a.user_id order by a.cnt desc"; 
    var self = this; 
    return new Promise(function _promise(resolve, reject) { 
    req.client.query(queryString, [], function result(error, result) { 
     req.done(error); 

     if (error) { 
     console.log('error ' + error.message); 
     return reject(error); 
     } 
     var users = result.rows.map(function(row) { 
     return new User(row); 
     }); 
     resolve(users); 
    }); 
    }); 

위의 패턴은 if 후 내용입니다 변화하는 유일한 것은 내가 그것을 밖으로 리팩토링하는 데 사용할 수있는 기능적 접근 방법은 나의 모든 방법이,이다?

query(req, "select * .... etc") 
.then(result => { 
    return result.rows.map(function(row) { 
     return new User(row); 
    }); 
}) 
.catch(reason => { 
    // error handling goes here 
}); 
+1

그래서 항상 당신을'resolve (users)'하겠습니까? 그럴 가능성이 희박한 것 같습니다 –

+0

@ JaromandaX 나는 변수가 될 것이라고 생각합니다. 설명을 수정하겠습니다. – CodeYogi

+0

모두 좋다 : p –

답변

1

Promisified "조회"기능

let query = (req, queryString, arg = []) => new Promise((resolve, reject) => { 
    req.client.query(queryString, arg, (error, result) => { 
     req.done(error); 
     if (error) { 
      return reject(error); 
     } 
     resolve(result); 
    }); 
}); 

사용법 : 하나 더 예를 추가

:

function queryDb(queryString, arr) { 
    var arr = arr || []; 
    return new Promise(function _promise(resolve, reject) { 
     req.client.query(queryString, arr, function result(error, result) { 
      req.done(error); 
      if (error) { 
       console.log('Error ' + error.message); 
       return reject(error); 
      } 
      resolve(result); 
     }); 
    }); 
} 

queryDb("queryString", arr).then(function(response){ //calling the function everytime like this 
    //do stuff here 
}, function(error){ 
    //handle error 
}) 
+0

'queryString '이후의 배열은 항상 비어있는 것은 아니지만, 네 포인트를 얻었다. – CodeYogi

+0

또 하나의 논쟁이 있습니다 - 다시 써 보겠습니다. –

+0

ES2015 + 코드가 마음에 들지 않으면, 나는 그것을 당신에게 줄 수 있습니다 : p –

0

은 당신이 뭔가를 할 수 있습니다 (질문에 예에 따라)

var queryString = 'select c.id, c.name, t.contact_user '+ 
    'from companies c, teams t '+ 
    'where t.user_id = $1::int and t.company_id = c.id '+ 
    'limit $2::int'; 
    var self = this; 
    return new Promise(function _promise(resolve, reject) { 
    req.client.query(queryString, [self.id, User._RESOURCE_LIMIT], 
     function result(error, result) { 
     req.done(error); 
     if (error) { 
     console.log('Error ' + error.message); 
     return reject(error); 
     } 

     self._companies = result.rows.map(function (data) { 
     return new Company(data); 
     }); 
     resolve(self); 
    }); 
    }); 
+0

여기에 오류를 기록하지 마십시오. 원한다면 에러 핸들러에 의해 로그되도록 할 수 있습니다. – naomik