Я пытаюсь использовать рекурсивные вызовы для получения данных из redis, остановки и возврата, когда члены возвращают null.Понимание обещаний в node.js для рекурсивной функции
Так мои данные добавлены как это:
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))});
Я могу посмотреть на примеры и посмотреть, теоретически, как это должно работать, но я не могу получить мой взгляд вокруг, как он должен работать с реализацией д. Любая помощь будет принята с благодарностью.
ли вы ранее имели обратный вызов на основе решения? – Bergi
Нет. Я попробовал, но это было намного сложнее. –