javascript - 一个异步任务执行树,如何按照深度优先遍历的方法一次次执行?
ringa_lee
ringa_lee 2017-04-11 13:03:18
[JavaScript讨论组]

如下图

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

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

ringa_lee
ringa_lee

ringa_lee

全部回复(3)
PHP中文网

可以用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));

(这个代码其实不需要任务是树形,只要求是无环图)

伊谢尔伦
var p1 = new Promise(function (resolve, reject) {
  // ...
});

var p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

这样p2就会在p1之后执行了。
可参考:promise

PHP中文网

就是实现一个promise的polyfill么。可以看看一个非常精简的代买实现 promise-lie
如果有看不明白的地方可以交流。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号