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

查看:174
本文介绍了javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

如下图

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

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

解决方案

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

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

这篇关于javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆