[英]How to make sync function from async in node.js?
I've a return type function: 我有一个返回类型函数:
var responseData = '';
function getResponseFromKey(key){
client.get(key, function(err, reply){
responseData = reply;
});
return responseData;
}
When I call this function first time it returns blank and then second time returns my value what I want after running again. 当我第一次调用此函数时,它将返回空白,然后第二次返回我的值,再次运行后将返回所需值。
I'm calling this function to print in html page. 我正在调用此函数以在html页面中打印。
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type':'text/plain'});
getResponseFromKey("my_key");
console.log(responseData);
}).listen(8083);
As I'm familiar with node the function is going in asynchronous way. 据我所知,该节点以异步方式运行。 Can you please help me to make synchronous way?
您能帮我做同步吗? Do I need to use
generators
in that case? 在这种情况下,我需要使用
generators
吗?
Help would be appreciated! 帮助将不胜感激!
You can use callback
, promise
or generator
. 您可以使用
callback
, promise
或generator
。
Using callback, you need to send a callback function and call it instead of returning a value 使用回调,您需要发送一个回调函数并调用它,而不是返回一个值
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);
Using promise, you need to return a 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);
If you are using and up-to-date version of nodejs, you can use arrow functions, to make your code more readable. 如果您正在使用最新版本的nodejs,则可以使用箭头功能,以使代码更具可读性。
Your client.get function is async try returing return responseData; 您的client.get函数是异步的,尝试重现返回responseData; inside the client.get body
在client.get主体内部
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);
In many case, the callback is not a good choose. 在许多情况下,回调不是一个好的选择。
You can use async
, promises
, generators
and async functions which supported in es7
. 您可以使用
async functions which supported in es7
async
, promises
, generators
和async functions which supported in es7
。
I recommend promises
beacuse the promise a key features in ES6. 我推荐
promises
因为诺言是ES6中的关键功能。
I think this article will help you. 我认为这篇文章会对您有所帮助。
https://blog.risingstack.com/node-js-async-best-practices-avoiding-callback-hell-node-js-at-scale/ https://blog.risingstack.com/node-js-async-best-practices-avoiding-callback-hell-node-js-at-scale/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.