我正在研究一个自动完成的原型。我查看了网络上的几个示例,它们是简单列表的自动完成。我的业务案例是多步骤的,因为自动完成必须处理同名但出生年份不同的人。
例子
用户类型:地理
返回可能的完成:
- George 1976 - 父亲:George Sr. 母亲:Karen
- 乔治 1980 年 - 父亲:杰克 母亲:帕姆
- 乔治亚娜 1972 年 - 父亲:大卫 母亲:卡罗尔
所以我对我的 redis 调用有四个步骤:
- zrank 前缀 'GEOR'
- > 4
- zrange 前缀 4 20
- > 乔治
- > 乔治*
- > 乔治
- > 格鲁吉亚
- > 格鲁吉亚语
- > 乔治亚娜*
- (对于每个以 * 结尾的名称)
- 成员“compnam:GEORGE”
- > 'personid:10'
- > 'personid:15'
- smembers "compnam:GEORGIANA"
- > 'personid:53'
- 成员“compnam:GEORGE”
- (每个人)
- hgetall 'personid:10'
- hgetall 'personid:15'
- hgetall 'personid:53'
希望这足够清楚。
我正在尝试创建与此类似的输出:
[ { name: 'George', yob: '1976', parentstr: 'Father: George Sr. Mother: Karen'},
{ name: 'George', yob: '1980', parentstr: 'Father: Jack Mother: Pam'},
{ name: 'Georgiana', yob: '1972', parentstr: 'Father: David Mother: Carol'}]
这是我的nodejs代码。
var app = express();
var client = redis.createClient();
app.get('/names/:name', function(req,res) {
var name_search = req.params.name;
client.zrank('prefix',name_search, function (err, obj){
client.zrange('prefix',obj+1,20, function(err,obj){
var returnNames = [];
async.each(obj,function(item){
if(item.slice(item.length-1)==='*'){
client.smembers('compnam:'+item.slice(0,item.length-1),function(err,obj){
async.each(obj,function(item){
client.hgetall(item,function(err,obj) {
Array.prototype.push.call(returnNames,obj);
console.log(returnNames);
})
},
function(err) {
console.log("error with redis1:"+err);
});
});
}
}, function(err) {
console.log("error with redis2");
});
console.log("Executed here before names added");
});
});
});
我对 Node.js 还是很陌生,所以我意识到我没有为 Node.js 的异步性质正确构建我的代码。任何帮助,将不胜感激。
-edit- 抱歉,不清楚。是的,console.log("Executed here before names are added") 是在其余工作完成之前执行的。最终这将更改为 res.send(returnNames)。我需要一些帮助来重组代码,以便一切都在最后一个 console.log 之前完成,或者如果我需要将我的最后一个 console.log 放在其他地方的不同回调中。