Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
497 views
in Technique[技术] by (71.8m points)

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

如下图

图片描述

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

可以用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));

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
...