MM们
可以用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));(这个代码其实不需要任务是树形,只要求是无环图)