我有一个返回类型函数:
var responseData = '';
function getResponseFromKey(key){
client.get(key, function(err, reply){
responseData = reply;
});
return responseData;
}
当我第一次调用此函数时它会返回空白,然后第二次在重新运行后返回我想要的值。
我正在调用此函数在html页面中打印。
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
getResponseFromKey("my_key");
console.log(responseData);
}).listen(8083);
由于我熟悉节点,因此该函数以异步方式运行。你能帮我做同步的方式吗?在这种情况下,我需要使用generators
吗?
帮助将不胜感激!
答案 0 :(得分:1)
您可以使用callback
,promise
或generator
。
使用回调,您需要发送回调函数并调用它而不是返回值
function getResponseFromKey(key, callback){
client.get(key, function(err, reply){
callback(reply);
});
}
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
getResponseFromKey("my_key", function() {
console.log(responseData);
});
}).listen(8083);
使用promise,你需要返回一个Promise
function getResponseFromKey(key) {
return new Promise(function(resolve, reject) {
client.get(key, function(err, reply) {
return resolve(reply);
});
})
}
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
getResponseFromKey("my_key").then(function(responseData) {
console.log(responseData);
});
}).listen(8083);
如果您使用的是nodejs的最新版本,则可以使用箭头功能,使您的代码更具可读性。
答案 1 :(得分:0)
你的client.get函数是异步尝试returing返回responseData;在client.get body中
var responseData = '';
function getResponseFromKey(key ,cb){
client.get(key, function(err, reply){
responseData = reply;
return cb(responseData);
});
}
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
getResponseFromKey("my_key", function(responseData) {
console.log(responseData);
});
}).listen(8083);
答案 2 :(得分:0)
在许多情况下,回调不是一个好的选择。
您可以使用async
,promises
,generators
和async functions which supported in es7
。
我建议promises
使用promise ES6中的主要功能。
我认为这篇文章会对你有帮助。
https://blog.risingstack.com/node-js-async-best-practices-avoiding-callback-hell-node-js-at-scale/