猿问

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

如下图

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

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


冉冉说
浏览 647回答 1
1回答

MM们

可以用Promise实现。每个任务的结果用一个Promise保存,如果A依赖B则在B resolve之后才开始A.const tasks = {&nbsp; a: {&nbsp; &nbsp; dep: ["b", "c"],&nbsp; &nbsp; run: (resultB, resultC) => resultB + resultC&nbsp; },&nbsp; b: {&nbsp; &nbsp; run: () => `B`&nbsp; },&nbsp; c: {&nbsp; &nbsp; dep: ["d"],&nbsp; &nbsp; run: resultD => `C` + resultD&nbsp; },&nbsp; d: {&nbsp; &nbsp; run: () => `D`&nbsp; },};const targetStack = [];function run(taskTree, target, results = {}) {&nbsp; if (targetStack.indexOf(target) !== -1) {&nbsp; &nbsp; const err = new Error(`recursive dependicies: ${targetStack.concat([target]).join(" <- ")}`);&nbsp; &nbsp; targetStack.length = 0;&nbsp; &nbsp; throw err;&nbsp; }&nbsp; targetStack.push(target);&nbsp; const deps = (taskTree[target].dep || []).map(&nbsp; &nbsp; depName => results[depName] = results[depName] || run(taskTree, depName, results)&nbsp; );&nbsp; targetStack.pop();&nbsp; return Promise.all(deps).then(deps => taskTree[target].run.apply(undefined, deps));}run(tasks, "a").then(resultA => console.log(resultA));(这个代码其实不需要任务是树形,只要求是无环图)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答