Получение неопределенной переменной в Javascript - PullRequest
3 голосов
/ 15 февраля 2011

ОБНОВЛЕННЫЙ КОД: я новичок в программировании на Javascript и получаю неопределенную переменную при попытке назначить новую переменную из метода.

Я использую node.js и создаю сервер redis с помощью redis-client в «переменной клиента».

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.

Любая помощь очень ценится, спасибо.

Мэтт

Ответы [ 3 ]

4 голосов
/ 15 февраля 2011

Я считаю, что это будет работать:

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, поэтому ваш исходный код не может работать.Нет прямого возвращаемого значения для хранения.

Вы можете установить таймер на некоторое разумное время отклика, а затем добавить код с использованием глобальной переменной.

Редактировать II: для вызоваметод снова, как только он будет завершен, получите такой код:

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 или вы не укажете какой-либо жестко заданный предел для предотвращения бесконечного цикла.

0 голосов
/ 20 июля 2012

Я столкнулся с той же проблемой, когда применил среду 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});});

};
0 голосов
/ 15 февраля 2011

Попробуйте вместо этого увидеть ошибки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...