2012-04-08 62 views
0

我有以下代码:socket.io回调

client.keys("key_"+id, function (err, replies){ 
     if (replies.length > 0){ 
     client.sunion(replies,function (err, replies){ 
      {...} 
     }); 
     }else{...} 
    }); 

下面我有这个功能

pg.connect(conString, function(err, client) {some code}); 

但我想在第一段代码执行pg.connect而不是...。 如何尽量避免复制代码和内存泄漏,pg.connect函数将在所有{...}中相同。

有了复制的代码,这将是这样的:

client.keys("key_"+id, function (err, replies){ 
     if (replies.length > 0){ 
     client.sunion(replies,function (err, replies){ 
      pg.connect(conString, function(err, client) {some code}); 
     }); 
     }else{pg.connect(conString, function(err, client) {some code});} 
    }); 

回答

1

记住你是在使用JavaScript和可以定义小助手功能,以减少你的打字...

function withConnect(callback) { 
    return pg.connect(conString, callback); 
} 

例如将节省你一些时间......但是如果错误处理程序总是一样的呢?

function withConnect(callback) { 
    return pg.connect(conString, function(err, client) { 
     if (err) { 
      handleError(err); 
     } 
     // we might still want something special on errors... 
     callback.apply(this, arguments); 
    } 
} 

你甚至可以用这种方式抽象简单的插入/更新样式查询。

0

你可以尝试(如果 “一些代码” 部分是相同的):

function connectFunc() { 
    return function (err){ 
     pg.connect(conString, function(err, client) {some code}); 
    }; 
} 

client.keys("key_"+id, function (err, replies){ 
    if (replies.length > 0){ 
     client.sunion(replies, connectFunc()); 
    } else { connectFunc()(err)} 
}); 

或者,如果 “一些代码” 而异:

function connectFunc(some_code) { 
    return function (err){ 
     pg.connect(conString, function(err, client) {some_code();}); 
    }; 
} 

client.keys("key_"+id, function (err, replies){ 
    if (replies.length > 0){ 
     client.sunion(replies, connectFunc(function(){some code})); 
    } else { connectFunc(function(){some other code})(err)} 
});