我试图做一个递归异步循环来跟踪nodejs中第三方lib的特定对象的所有子节点。
下面是伪代码:
var tracer = function(nodes){
var promises [];
nodes.forEach(function(node){
// trace returns a promise ...
var promise = builder.trace(node)
promises.push(promise);
promise.then(function(tree){
// if we had children, get those
if(tree.children.length){
promises.push.apply(promises, tracer(tree.children));
}
});
});
return promises;
};
RSVP.all(tracer(myArr)).then(function(allTrees){ ... });
但我不能指出如何正确解决这些问题并将结果返回到一个数组中。
答案 0 :(得分:3)
在延迟回调中,您不得push
数组上的递归promise。相反,您需要立即推送表示递归结果的承诺(通过延迟产生的承诺解决)。幸运的是,你甚至可以从then
电话那里得到回报。
此外,我会将each
替换为map
,并在函数内立即执行RSVP.all
,因为不期望调用者处理该问题。
function tracer(nodes){
var promises = nodes.map(function(node){
// trace returns a promise ...
var promise = builder.trace(node)
var recusivePromise = promise.then(function(tree){
// if we had children, get those
if (tree.children.length)
return tracer(tree.children));
else
return node;// the leaf node itself
});
return recusivePromise; // which will resolve with the `tracer(…)` result
// or the leaf
});
return RSVP.all(promises);
}
tracer(myArr).then(function(allTrees){ … });
答案 1 :(得分:0)
我最终采用了反型方法......
var traceDeps = function(parents, cb){
var count = 0,
trees = [],
trace = function(nodes){
nodes.forEach(function(node){
count++;
builder.trace(node).then(function(tree){
trees.push(tree);
if(tree.children.length){
trace(tree.children);
}
count--;
if (count === 0) cb(trees);
});
});
};
trace(parents);
};
traceDeps(myArr, function(trees){ ... });