我正在NodeJs中编写一个API包装器,并且我试图干净地处理来自http.get()的响应。问题的根源在于我讨厌所有教程中不干净的编码风格,其中回调方法是匿名内联定义的。
// Bad. Can get ugly if the handle function has multiple lines or nested callbacks
http.get("www.example.com", function(response){/* handle response */});
// Better. Follows clean-code guidelines. Code is more reusable. Etc
var handleResponse = function(response){
// handle response
}
http.get("www.example.com", handleResponse);
虽然我更喜欢后者,但我似乎无法将额外的参数传递给handleResponse,特别是我希望handleResponse调用的回调。
我目前的工作原理是什么:
module.exports = function() {
return {
apiGet: function(url, callback) {
http.get(url, function(response) {
var result = handleResponse(response);
callback(null, result);
});
}
}
}
我想拥有什么(但不起作用)
module.exports = function() {
var handleResponse = function(response) {
var result = handleResponse(response);
callback(null, result);
};
return {
apiGet: function(url, callback) {
http.get(url, handleResponse);
}
}
}
此代码的问题在于handleResponse()方法中未定义回调。我似乎无法解决这个问题。
我尝试过的事情。
// hoping extra parameters get passed to function. Nope.
return {
http.get(url, handleResponse, callback);
}
// Trying out a suggestion from a random blog I found while googling for an answer. Nope.
return {
http.get(url, handleResponse.bind({callback: callback});
}
答案 0 :(得分:3)
如果你有一个主要工作是做某事的功能,那么将控制流传递给其他功能,然后你可以考虑编写handleResponse()
而不是编写makeResponseHandler()
函数。基本上,使用函数工厂:
function makeResponseHandler (callback) {
return function (response) {
// deal with response here
callback(null, result);
}
};
return {
apiGet: function(url, callback) {
http.get(url, makeResponseHandler(callback));
}
}
注意:如果您仔细查看,实际上并未将makeResponseHandler
传递给http.get()
,而是调用makeResponseHandler()
并将其返回的内容传递给http.get()
。< / p>
答案 1 :(得分:1)
所以我发现了一些在this related thread中有用的东西。
return {
http.get(url, function(response){ handleResponse(response, callback); });
}
这似乎是一个合理的妥协。我可以将一个长匿名函数转换为一个小的匿名函数,只需用所需信息调用我的显式函数。
在我这样做之前,有没有人对我想要完成的事情有任何其他建议?我一直在寻求最高级别的代码可读性。
答案 2 :(得分:0)
为什么不使用:
var req = http.get("www.example.com");
req.SOME_VARIABLE = "something";
req.on("response", function(res){
//Do something with req.SOME_VARIABLE
});