给NodeJs的Http回调方法传递额外参数

3

我正在使用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()中未定义回调函数callback。我似乎无法解决这个问题。
我尝试过以下几件事:
// 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}); 
}
3个回答

4

如果你有一个主要工作是做一些事情然后将控制流传递给其他函数的函数,那么也许你应该考虑编写一个makeResponseHandler()而不是handleResponse()。基本上,使用函数工厂:

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()

1

所以我在这个相关的帖子中找到了一些有效的东西。

return {
    http.get(url, function(response){ handleResponse(response, callback); }); 
}

这似乎是一个合理的妥协。我可以将一个长的匿名函数转换为一个小的匿名函数,只需使用所需的信息调用我的显式函数。

在我采取这个方案之前,有没有人对我想要实现的目标有其他建议?我始终追求最高水平的代码可读性。


0
为什么不使用:
var req = http.get("www.example.com");

req.SOME_VARIABLE = "something";

req.on("response", function(res){
    //Do something with req.SOME_VARIABLE
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接