如何从Node.js中的函数返回状态代码

时间:2011-11-21 08:08:10

标签: javascript node.js http-status-codes

我有这样的功能:

function getStatusCode(site){
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
                    Host: site
            }
        };

    var status;

    http.get(options, function(response) {
        status=response.statusCode;
    });
    return status;
} 

如何仅在http.get完成工作时返回状态,或者如果超时(例如10秒)则返回null?

3 个答案:

答案 0 :(得分:10)

node.js背后的整个想法是它的异步性质。你要做的是通过尝试使它同步来违反最根本的设计模式。

由于get方法的异步性质,您无法执行此操作。您只能在回调函数内操作状态代码。所以你的getStatusCode不需要返回任何东西。您可以使用一个额外的参数来表示结果可用后调用的回调:

function getStatusCode(site, callback) {
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
            Host: site
        }
    };

    http.get(options, function(response) {
        callback(response.statusCode);
    });
}

然后:

getStatusCode('http://...', function(statusCode) {
    alert(statusCode);
});

答案 1 :(得分:2)

建议的方法不能很好地扩展,特别是如果你需要错误处理:在复杂的情况下你会得到lambda的意大利面。因此,上面的示例应该像入门级教程一样对待,不应该在生产中使用。

您可以使用return异步返回值,但是您应该返回值而不是某种延续。期货和承诺是这种延续的一个例子。寻找提供它们的NPM库。有关示例,请参阅qq-http库。

另见以下相关问题:

What is the benefit of a 'promise' abstraction in CommonJS?

Understanding promises in node.js

我认为q库是有区别的,因为它有姐妹库(q-ioq-http)使用promises实现大多数标准node.js库。

实际上,节点的早期标准库使用了promises,但后来他们决定使用回调。这不是因为承诺不好,而是因为回调是较低级别的。

答案 2 :(得分:1)

你不能“返回”它本身,因为那将需要i / o上的功能块,这是一个节点否否。相反,您可以传递一个回调函数,该函数将使用您的状态代码调用。

function getStatusCode(site, callback){
    var options = {
        host: "127.0.0.1",
        port: 8000,
        path: site,
        headers: {
            Host: site
            }
        };

    var status;

    http.get(options, function(response) {
        status=response.statusCode;
        callback(status);
    });
}