一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?

发布于 2022-09-04 18:07:05 字数 244 浏览 14 评论 0

如下图

图片描述

这样一个树形结构的异步树。该怎么写才能保证每个异步操作依次等待执行。

即上一个操作完成之后再执行下一个,后一个执行可能会用到前一个执行的返回结果

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北方的韩爷 2022-09-11 18:07:05

可以用Promise实现。每个任务的结果用一个Promise保存,如果A依赖B则在B resolve之后才开始A.


const tasks = {
  a: {
    dep: ["b", "c"],
    run: (resultB, resultC) => resultB + resultC
  },
  b: {
    run: () => `B`
  },
  c: {
    dep: ["d"],
    run: resultD => `C` + resultD
  },
  d: {
    run: () => `D`
  },
};

const targetStack = [];

function run(taskTree, target, results = {}) {
  if (targetStack.indexOf(target) !== -1) {
    const err = new Error(`recursive dependicies: ${targetStack.concat([target]).join(" <- ")}`);
    targetStack.length = 0;
    throw err;
  }
  targetStack.push(target);
  const deps = (taskTree[target].dep || []).map(
    depName => results[depName] = results[depName] || run(taskTree, depName, results)
  );
  targetStack.pop();
  return Promise.all(deps).then(deps => taskTree[target].run.apply(undefined, deps));
}

run(tasks, "a").then(resultA => console.log(resultA));

(这个代码其实不需要任务是树形,只要求是无环图)

戏蝶舞 2022-09-11 18:07:05
var p1 = new Promise(function (resolve, reject) {
  // ...
});

var p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

这样p2就会在p1之后执行了。
可参考:promise

相思碎 2022-09-11 18:07:05

就是实现一个promise的polyfill么。可以看看一个非常精简的代买实现 promise-lie
如果有看不明白的地方可以交流。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文