首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript中获取未定义的变量

在Javascript中获取未定义的变量
EN

Stack Overflow用户
提问于 2011-02-15 21:38:22
回答 3查看 1.8K关注 0票数 3

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

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

代码语言:javascript
复制
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时,它会返回"undefined“。我尝试将回调函数中的值赋给全局变量numberPosts。

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

哑光

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-15 21:45:45

我相信这将会奏效:

代码语言:javascript
复制
client.get("global:nextPostId", function (err, reply) {
    console.log("Number of posts: " + reply.toString());
})

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

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

代码语言:javascript
复制
var _numOfPosts = "";

然后:

代码语言:javascript
复制
client.get("global:nextPostId", function (err, reply) {
     _numOfPosts = reply.toString());
})

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

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

编辑II:为了在方法完成后再次调用它,需要这样的代码:

代码语言:javascript
复制
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,或者您通过了一些硬编码限制,以防止无限循环。

票数 4
EN

Stack Overflow用户

发布于 2011-02-15 21:43:23

请尝试执行以下操作以查看错误:

代码语言:javascript
复制
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);

正如影子向导所指出的,由于client.get()没有返回任何内容,所以您正试图在numberPosts中包含某些内容之前使用它。

请阅读以下内容以了解node.js流:

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-20 17:29:38

当我应用MVC框架时,我也面临着同样的问题。为了解决这个问题,我使用了render函数。

在posts模型中

代码语言:javascript
复制
exports.get = function(id,render) {
    client.incr('post:id:'+id, function(err, reply) {
    render(reply);
    });
};

在帖子控制器中

代码语言:javascript
复制
exports.get = function(req, res) {
    posts.get('001', function (data){res.render('index',{post:data});});

};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5004335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档