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