【问题标题】:Asynchronously tree traversal using tree-model-js使用 tree-model-js 异步遍历树
【发布时间】:2015-03-10 00:34:11
【问题描述】:

我想知道有没有一种方法可以使用 tree-model-js 异步遍历/遍历树。在 tree-model-js 中有一个 walk 函数。但是,它似乎不是 aync 函数。

基本上,我有一些异步进程来处理树的每个节点。我需要一种 aync 遍历数据树的方法,以确保每个 aync 进程都以特定顺序发生(例如:预购),并在完成遍历树时使用回调返回最终结果。

如果tree-model-js没有这个功能,有没有办法异步遍历我的datatree?

【问题讨论】:

  • 您好,如果给出的答案满足您的问题,请采纳。否则,请告诉我们缺少的内容,以便我们为您提供更有意义的答案。

标签: javascript node.js asynchronous tree treemodel


【解决方案1】:

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 函数为从根到叶的每条路径组成一个承诺,然后同时执行这些组成的承诺中的每一个。我使用了 Q 库作为 promises,因为我很熟悉它。

不确定这是否有助于您的用例。您可以使用此代码here

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2021-05-30
    相关资源
    最近更新 更多