更新代码:i,我是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时,它返回“undefined”。我正在尝试将回调函数内的值赋给全局变量numberPosts。
非常感谢任何帮助,谢谢。
马特
答案 0 :(得分:4)
我相信这会奏效:
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或者你传递一些硬编码限制以防止无限循环。
答案 1 :(得分:0)
请尝试使用此功能来查看错误:
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流程的句柄:
答案 2 :(得分:0)
当我应用MVC框架时,我遇到了同样的问题。 为了解决这个问题,我采用了渲染功能。
在帖子Model
中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});});
};