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

时间:2015-07-13 22:16:08

标签: javascript node.js callback

我正在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}); 
}

3 个答案:

答案 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
});