javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?
本文介绍了javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
如下图
这样一个树形结构的异步树。该怎么写才能保证每个异步操作依次等待执行。
即上一个操作完成之后再执行下一个,后一个执行可能会用到前一个执行的返回结果。
解决方案
可以用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));
(这个代码其实不需要任务是树形,只要求是无环图)
这篇关于javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文