NodeJS 中的递归异步循环
Recursive Async Looping in NodeJS
我正在尝试执行递归异步循环,以从 nodejs 中的第三方库中跟踪特定对象的所有子对象。
这是伪代码:
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){ ... });
但我不知道如何让它们全部正确解析,并且 returns 将结果放在一个数组中。
您不得 push
延迟回调中对数组的递归承诺。相反,您需要立即推送代表递归结果的承诺(用那些延迟产生的承诺解决)。幸运的是,您甚至可以从那个 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){ … });
我最终采用了计数器类型的方法...
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){ ... });
我正在尝试执行递归异步循环,以从 nodejs 中的第三方库中跟踪特定对象的所有子对象。
这是伪代码:
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){ ... });
但我不知道如何让它们全部正确解析,并且 returns 将结果放在一个数组中。
您不得 push
延迟回调中对数组的递归承诺。相反,您需要立即推送代表递归结果的承诺(用那些延迟产生的承诺解决)。幸运的是,您甚至可以从那个 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){ … });
我最终采用了计数器类型的方法...
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){ ... });