我可以知道有没有一种方法可以使用 tree-model-js 异步遍历/遍历树。在 tree-model-js 中有一个 walk 函数。但是,它似乎不是 aync 函数。
基本上,我有一些 aync 进程来处理树的每个节点。我需要一种 aync 遍历数据树的方法,以确保每个 aync 进程都以特定顺序发生(例如:预购),并在完成遍历树时使用回调返回最终结果。
如果 tree-model-js 没有这样的功能,有没有办法异步遍历我的数据树?
我可以知道有没有一种方法可以使用 tree-model-js 异步遍历/遍历树。在 tree-model-js 中有一个 walk 函数。但是,它似乎不是 aync 函数。
基本上,我有一些 aync 进程来处理树的每个节点。我需要一种 aync 遍历数据树的方法,以确保每个 aync 进程都以特定顺序发生(例如:预购),并在完成遍历树时使用回调返回最终结果。
如果 tree-model-js 没有这样的功能,有没有办法异步遍历我的数据树?
tree-model-js不支持异步遍历。但是,您仍然可以为每个访问的节点编写或调用异步代码。
如果我正确理解了您的问题,您需要等待父长任务完成,然后再调用子长任务。这可能会帮助您:
var tree = new TreeModel();
var root = tree.parse({
id: 1,
children: [
{
id: 11,
children: [{id: 111}]
},
{
id: 12,
children: [{id: 121}, {id: 122}]
},
{
id: 13
}
]
});
function longTask(node) {
// Some long running task
console.log("Running long task on node " + node.model.id);
// Fake result
return "res=" + node.model.id;
}
function asyncWalk(node) {
var leafPromises = [];
var promisesTemp = {};
node.walk(function (node) {
var nodePromise;
if (node.isRoot()) {
nodePromise = Q.fcall(function () {
return [longTask(node)];
});
} else {
nodePromise = promisesTemp[node.parent.model.id].then(function (prevResult) {
return prevResult.concat(longTask(node));
});
}
if (!node.hasChildren()) {
leafPromises.push(nodePromise);
} else {
promisesTemp[node.model.id] = nodePromise;
}
});
return Q.all(leafPromises);
}
// Using our async walk function...
asyncWalk(root).then(function (leafPromisesResult) {
leafPromisesResult.forEach(function (leafPromiseResult) {
console.log("ordered results: " + leafPromiseResult);
});
});
请注意,该asyncWalk
函数为从根到叶的每条路径组成一个 Promise,然后同时执行这些组成的 Promise 中的每一个。我使用Q库作为 Promise,因为我很熟悉它。
不确定这是否有助于您的用例。您可以在此处使用此代码。