【问题标题】:Getting Undefined Variable in Javascript在 Javascript 中获取未定义的变量
【发布时间】:2011-02-15 13:38:22
【问题描述】:

更新的代码:我是 Javascript 编程的新手,在尝试从方法分配新变量时得到一个未定义的变量。

我正在使用 node.js 并使用“客户端变量”中的 redis-client 创建一个 redis 服务器。

var redis = require("redis");
var client = redis.createClient();

client.on("error", function (err) {
console.log("Error " + err); });

var numberPosts;

client.get("global:nextPostId", function(err, replies) {
  numberPosts = replies;
  console.log(numberPosts);
});

console.log(numberPosts);

当我在回调函数中调用 console.log 时,它会返回正确的值,但是当我在回调函数之外调用 console.log 时,它会返回“未定义”。我正在尝试将回调函数内部的值分配给全局变量 numberPosts。

非常感谢任何帮助,谢谢。

马特

【问题讨论】:

  • 当 var numberPosts = client.get("global:nextPostId", redis.print);执行它会导致未定义。
  • 你根本不能这样做。有关详细信息,请参阅我的答案。

标签: javascript variables callback node.js


【解决方案1】:

我相信这会奏效:

client.get("global:nextPostId", function (err, reply) {
    console.log("Number of posts: " + reply.toString());
})

AJAX 调用是异步的,因此它没有返回值。相反,您必须使用回调函数,并且只有在那里您才能获得服务器方法返回的值。

编辑:要将返回值赋给全局变量,首先声明全局变量:

var _numOfPosts = "";

然后:

client.get("global:nextPostId", function (err, reply) {
     _numOfPosts = reply.toString());
})

但是,在 AJAX 调用完成之前,该值将不可用,因此您的原始代码无法运行。没有直接的返回值来存储。

您可以将计时器设置为一些合理的响应时间,然后在其中设置使用全局变量的代码。

编辑二:为了在完成后再次调用该方法,有这样的代码:

var _nextPostCallCount = 0;
function GetNextPost() {
   //debug
   console.log("GetNextPost called already " + _nextPostCallCount  + " times");

   //sanity check:
   if (_nextPostCallCount  > 1000) {
      console.log("too many times, aborting");
      return;
   }

   //invoke method:
   client.get("global:nextPostId", function(err, replies) {
      numberPosts = parseInt(replies.toString(), 10);
      console.log("num of replies #" + (_nextPostCallCount + 1) + ": " + numberPosts);

      //stop condition here.... for example if replies are 0
      if (!isNaN(numberPosts) && numberPosts > 0)
         GetNextPost();
   });

   //add to counter:
   _nextPostCallCount++;
}
GetNextPost();

这将一遍又一遍地调用该方法,直到结果为 0 或者您通过了一些硬编码限制以防止无限循环。

【讨论】:

  • 这行得通,我们已经能够让它发挥作用。但是我们遇到的问题是当我们尝试将值“reply”分配给全局变量时。
  • 显示向导:感谢您对此的帮助。不幸的是,当我尝试在回调函数之外访问 _numOfPosts 时,它仍然返回 undefined。
  • @Mat try window.setTimeout(function() { alert("num: " + _numOfPosts); }, 3000); 这将在 3 秒后显示警报,此时全局变量应该具有值。
  • 当我重读这篇文章时,看起来你要留下来这可能是不可能的。让我告诉你我们正在努力实现的目标。我们本质上只是想将 global:nextPostId 的值返回到一个变量中,然后遍历每个 post id 并将每个 post body 吐出到 websocket 中。
  • 我们使用的是 node.js 并且是处理异步数据的新手。
【解决方案2】:

试试这个来查看错误:

var redis = require("redis"); 

client = redis.createClient(); 

client.on("error", function (err) {
console.log("Error " + err); });

//note the error logging
var numberPosts = client.get("global:nextPostId", function (error, response) {
  if (error) {
    console.log("async: " + error);
  } else {
    console.log("programming: " + response);
  }
});

console.log("is lotsa fun: " + numberPosts);

正如 Shadow Wizard 所指出的,您正在尝试在 numberPosts 中有内容之前使用它,因为 client.get() 没有返回任何内容。

阅读本文以了解 node.js 流程:

http://www.scribd.com/doc/40366684/Nodejs-Controlling-Flow

【讨论】:

  • 这与最初发布的内容完全相同,只是您引入了一个全局变量(“client”),对吧?为什么这会有什么不同?
  • 这不是问题所在。注意 require("redis") 之后的原始代码中的“,”。我们特别遇到了 var numberPosts = client.get("global:nextPostId", redis.print); 的问题这导致未定义。
  • 没有错误,他正在尝试在响应到达之前使用它。
  • console.log"很有趣:+ numberPosts);仍然返回“未定义”
  • 由于影子向导所说的原因,它未定义,在它存在之前你不能使用它,闭包外的调用比 client.get “更快”,所以它什么都没有。 .你需要等到有东西从client.get返回后才能使用它
【解决方案3】:

我在应用 MVC 框架时遇到了同样的问题。 为了解决这个问题,我使用了渲染函数。

在帖子模型中

exports.get = function(id,render) {
    client.incr('post:id:'+id, function(err, reply) {
    render(reply);
    });
};

在帖子控制器中

exports.get = function(req, res) {
    posts.get('001', function (data){res.render('index',{post:data});});

};

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2019-10-18
    • 2021-02-08
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多