1 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
可以用Promise實(shí)現(xiàn)。每個(gè)任務(wù)的結(jié)果用一個(gè)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));
(這個(gè)代碼其實(shí)不需要任務(wù)是樹形,只要求是無環(huán)圖)
添加回答
舉報(bào)