我正在尝试使用递归调用从Redis中获取数据,并在成员返回null时停止并返回。
所以我的数据是这样添加的:
SADD parents.<name> <parent1> <parent2>
SADD parents.<parent1> <grandparent1> <grandparent2>
...
最终数据应如下所示:
[
{
label: <name>,
parents: [
{ label: <parent1>,
parents: [ {label: <grandparent1>}, {label: <grandparent2> }] },
{ label: <parent2> }
]
}
]
这是我正在弄乱的代码(从不同来源将它们拼凑在一起),但是我不知道自己在做什么。不知道这段代码是否有用,我可能会偏离正轨。
var redis = require('node-redis');
var r_client = redis.createClient();
var Q = require('q');
function getFromRedis(nodeName){
var ret = Q.defer();
r_client.smembers('parents.' + nodeName,function(err,val){
if (err) ret.reject(err);
else {
var constructedObject={}; //this is our returned object
var dependents=[];
if (val)
{
for (var k in val){ //iterate the keys in val
constructedObject.name = val[k];
dependents.push(getFromRedis(val[k])
.then(function(subVal){
constructedObject[k]=subVal;
return ret.promise;
})
);
}
}
else { return [] }
}
Q.all(dependents)
.then(function(){ret.resolve(constructedObject);},ret.reject.bind(ret));
});
return ret;
}
getFromRedis( 'greg', function(out) {console.log('Final output: ' + JSON.stringify( out ))} );
我可以看一下示例,从理论上看它应该如何工作,但是我无法确定它如何与q实现一起工作。任何帮助将不胜感激。
r_client.smembers()
和调用getFromRedis
方法进行此操作我只能看到一个特定的错误,它将使您的脚本无法正常工作:
return [];
对回调没有任何影响。因此,ret
在这种情况下永远都不会解决。ret.resolve([]); return;
如果有的话,你会做的。但是,有更好的解决方案可让您return
再次使用。
要重组脚本,有两点:
Q.nfcall
辅助函数(等)避免直接处理回调样式的API。then
然后使用转换其结果-同步返回树叶或用于后代计算的承诺。Q.all
首先使用,然后转换其结果。不要为每个都添加处理程序dependent
,而只需construct
一步即可获得全部结果并构建。function getFromRedis(nodeName){
return Q.ninvoke(r_client, "smembers", 'parents.' + nodeName).then(function(val) {
// this is our returned object
var constructedObject = {label: nodeName};
if (val) {
var dependents = val.map(function(par) {
// get a promise for the next level
return getFromRedis(nodeName+"."+par.toString());
});
return Q.all(dependents).then(function(dependentResults) {
constructedObject.parents = dependentResults;
return constructedObject;
});
} else {
return constructedObject; // without parents
}
});
}
getFromRedis( 'greg' ).done(function(out) {
console.log('Final output: ' + JSON.stringify( out ));
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句