【问题标题】:How to make sync function from async in node.js?如何从 node.js 中的异步进行同步功能?
【发布时间】:2017-06-20 14:20:12
【问题描述】:

我有一个返回类型函数:

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

我们将不胜感激!

【问题讨论】:

标签: javascript node.js asynchronous synchronization


【解决方案1】:

您的 client.get 函数是异步尝试返回返回 responseData;在 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);

【讨论】:

  • 我在运行您的代码时遇到此错误TypeError: cb is not a function
  • 你写这个正确了吗 getResponseFromKey("my_key", function(responseData) { console.log(responseData); });
  • 回调是函数调用中的第二个参数。
【解决方案2】:

您可以使用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,您可以使用箭头函数,让您的代码更具可读性。

【讨论】:

    【解决方案3】:

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

    您可以使用async,promises,generatorsasync functions which supported in es7

    我推荐promises,因为promise 是 ES6 中的一个关键特性。

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 2013-05-11
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2016-07-18
      相关资源
      最近更新 更多