【发布时间】:2014-05-01 10:47:59
【问题描述】:
我在 Node.js 中有一个复杂的递归函数,为了这个问题,我将其简化为以下内容:
function sum(tree) {
if (!tree) return 0;
var sumLeft = sum(tree.left);
var sumRight = sum(tree.right);
return sumLeft + tree.val + sumRight;
}
var exampleTree = {
val: 3,
right: { val: 4 },
left: { val: 5,
right: {val: 6},
left: {val: 7}
}
}
console.log(sum(exampleTree)); // returns 25 = 3+4+5+6+7
现在我想将函数“sum”转换为异步函数:
function sumAsync(tree, callback) {
// ???
}
但是,由于该函数现在没有返回值,我不知道如何获取值 sumRight 和 sumLeft 并将它们组合起来。
一种可能的选择是完全重写算法,使其是迭代的而不是递归的(正如这个问题中所建议的那样:how to make this synchronous recursive function asynchronous)。但是,在许多情况下,这可能非常复杂,并且会使整个程序不可读。有没有一种解决方案可以保持递归函数的简单结构,同时使其异步?
注意:我的问题不是对树中的值求和...tree-sum 函数只是一个最小的工作示例。
编辑:根据 vkurchatkin 的回答和评论,我决定使用 async.parallel。结果如下:
var async = require("async");
function sumAsync (tree, callback) {
if (!tree) return setImmediate(callback.bind(null, null, 0));
async.parallel([
sumAsync.bind(this, tree.left),
sumAsync.bind(this, tree.right),
],
function(err, results) {
callback(err, tree.val+results[0]+results[1]);
});
}
sumAsync(exampleTree, function(err, result) {
console.log(result); // prints 25
});
【问题讨论】:
-
您是否尝试继续传递回调,当您到达树结构的末尾时调用它。虽然解析这棵树的异步行为看起来有点太多了..
-
你能举个例子吗?
标签: node.js asynchronous recursion