新手问题。为什么这个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集的内容:我可以让它从回调内部返回吗?如果没有,我该怎么办?
此外,关于我递归使用此函数的方式的建议将受到欢迎 - 我不确定它是否完全合理:)
感谢您帮助新人。
答案 0 :(得分:2)
您无法从回调中返回。这样做:
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