为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

冉冉说 2018-11-12 12:15:33
如下图这样一个树形结构的异步树。该怎么写才能保证每个异步操作依次等待执行。即上一个操作完成之后再执行下一个,后一个执行可能会用到前一个执行的返回结果。
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

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

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

查看完整回答
反对 回复 2018-12-03
  • 1 回答
  • 0 关注
  • 646 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号