节点/ redis中的JavaScript控制stream:从callback中返回?

新手问题。 为什么这个JavaScript函数返回undefined?

var redis = require("redis"), client = redis.createClient(); function generatePageUrl() { var randomStr = randomInt.toString(32); // Check whether this URL is already in our database; client.smembers("url:" + randomStr, function (err, data ) { if (data.length != 0) { // URL already in use, try again return getPageUrl(); } return randomStr; }); } var page_url = generatePageUrl(); // add it to the database, etc 

我想它一定会到达client.smembers的内部,然后返回。

但是我真的需要在返回之前检查Redis的内容:我可以从callback中返回吗? 如果没有,我该怎么办?

此外,对我使用这个函数recursion的方式的build议将是受欢迎的 – 我不知道这是完全合理的:)

感谢您帮助新人。

你不能从callback中返回。 像这样做:

 var redis = require("redis"), client = redis.createClient(); function generatePageUrl(cb) { var randomStr = randomInt.toString(32); // Check whether this URL is already in our database; client.smembers("url:" + randomStr, function (err, data ) { if (data.length != 0) { // URL already in use, try again getPageUrl(cb); } cb(randomStr); }); } generatePageUrl(function(page_url){ // add it to the database, etc }); 

如果你不喜欢这种风格,你可能会考虑streamlinejs – 它使你能够写这样的代码:

 var redis = require("redis"), client = redis.createClient(); function generatePageUrl(_) { var randomStr = randomInt.toString(32); // Check whether this URL is already in our database; var data = client.smembers("url:" + randomStr, _); if (data.length != 0) { // URL already in use, try again return getPageUrl(_); } return randomStr; } var page_url = generatePageUrl(_); // add it to the database, etc