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){ ... });
但我无法确定如何让它们全部正确解析并在一个数组中返回结果。
您不得在延迟回调中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){ ... });
相关文章:
- 无递归的异步循环
- 如何制作一个干净的异步循环
- 异步循环使用递归:如何访问推送数组数据
- 如何从Node.js中的异步循环返回
- NodeJS中的递归异步循环
- JavaScript 异步循环不返回结果
- 如何在节点 js 中打破内部异步循环
- “异步”循环访问JavaScript中的对象
- Javascript异步循环处理
- 另一个异步循环中的Javascript异步循环
- Node.js异步循环,在下一个循环之前从函数回调
- 在Node.js中处理异步循环的最佳模式
- 双异步循环,如何保证正确排序顺序的最终结果?(javascript)
- 带生成器的异步循环
- 暂停JavaScript异步循环一段时间
- 使用携带另一个数组的对象对数组进行异步循环
- jQuery的异步循环deferred (promises)
- 确定异步循环的结束
- 如何在后台创建异步循环
- Javascript/node.js中的异步循环