如何在node.js中从异步生成同步功能?

时间:2017-02-03 09:01:42

标签: javascript node.js asynchronous synchronization

我有一个返回类型函数:

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吗?

帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

您可以使用callbackpromisegenerator

使用回调,您需要发送回调函数并调用它而不是返回值

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)

在许多情况下,回调不是一个好的选择。

您可以使用asyncpromisesgeneratorsasync functions which supported in es7

我建议promises使用promise ES6中的主要功能。

我认为这篇文章会对你有帮助。

https://blog.risingstack.com/node-js-async-best-practices-avoiding-callback-hell-node-js-at-scale/