我有这样的功能:
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?
答案 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库。有关示例,请参阅q
和q-http
库。
另见以下相关问题:
What is the benefit of a 'promise' abstraction in CommonJS?
Understanding promises in node.js
我认为q
库是有区别的,因为它有姐妹库(q-io
,q-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);
});
}