1 回答
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));
(这个代码其实不需要任务是树形,只要求是无环图)
添加回答
举报
