0

我在寫一個小應用程序,它與數據庫通信,而不是使用回調模式,我使用Promise來簡化我的代碼。經過大量的編碼,我現在可以在我的代碼中非常頻繁地看到一些模式,我需要知道如何重構它,以便類似的邏輯在一個地方。javascript中的重構模式

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後變化爲內容的唯一的事,是任何功能的方法,我可以用它來重構出來?

添加一個例子:

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); 
    }); 
    }); 
+1

所以你總是'解析(用戶)'?這似乎不太可能 –

+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); 
    }); 
}); 

用途(如每例中的問題)

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

'queryString'後面的數組不會總是空的,但是我明白了你的觀點。 – CodeYogi

+0

另一個說法然後 - 讓我重寫它 –

+0

如果ES2015 +代碼不符合您的喜好,我可以爲您編譯它:p –

0

你可以做這樣的事情:

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

不要在這裏記錄錯誤。如果需要,只需「拒絕」它並允許它由錯誤處理程序記錄。 – naomik