简体   繁体   English

如何在node.js中通过异步使同步功能?

[英]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 . 您可以使用callbackpromisegenerator

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 asyncpromisesgeneratorsasync 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM