Javascript 中的任务运行器

2023-12-25

我有一个任务列表,只有在解决每个任务的所有依赖关系后才需要执行所有这些任务。我正在努力找出一种方法来在最佳时间完成所有任务。

// Each node is a async job, illustrated by setTimeout.
// A and C can run at the same time.
// D, needs to wait for A and C to be done.
// E needs to wait for A and D to be done.

function runTasks(tasks) {
 // run tasks
}

// Sample of tasks
var tasks = {
  'a': {
    job: function (finish) {
      setTimeout(function () {
        console.log('a done');
        finish();
      }, 500);
    },
  },
  'c': {
    job: function (finish) {
      setTimeout(function () {
        console.log('c done');
        finish();
      }, 200);
    },
    dependencies: [],
  },
  'd': {
    job: function (finish) {
      setTimeout(function () {
        console.log('d done');
        finish();
      }, 100);
    },
    dependencies: ['a','c'],
  },
  'e': {
    job: function (finish) {
      setTimeout(function () {
        console.log('e done');
        finish();
      }, 200);
    },
    dependencies: ['a', 'd'],
  },
};

您可以启动可以启动的并行承诺。

  1. 首先启动所有没有依赖关系的独立任务
  2. 完成独立任务后存储在地图/集合中
  3. 然后使用完整的重复步骤集过滤一组新任务。
const wait = (ms, task) =>
  new Promise((resolve) =>
    setTimeout(() => {
      console.log(`${task} done`);
      resolve();
    }, ms)
  );

const tasks = {
  a: {
    job: () => wait(500, "A"),
    dependencies: [],
  },
  c: {
    job: () => wait(500, "C"),
    dependencies: [],
  },
  d: {
    job: () => wait(500, "D"),
    dependencies: ["a", "c"],
  },
  e: {
    job: () => wait(500, "E"),
    dependencies: ["a", "d"],
  },
};

const run = async () => {
  const completed = new Set();
  const keys = Object.keys(tasks);
  const runTasks = async (pendingTasks) => {
    const promises = pendingTasks.map((key) => tasks[key].job());
    await Promise.all(promises);
    pendingTasks.forEach((key) => completed.add(key));
  };

  const runner = async () => {
    const pendingTasks = keys.filter((key) => {
      if (!completed.has(key)) {
        const { dependencies } = tasks[key];
        return dependencies.every((dependency) => completed.has(dependency));
      }
      return false;
    });
    if (pendingTasks.length !== 0) {
      await runTasks(pendingTasks);
      return runner();
    }
  };

  await runner();
};

run();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 中的任务运行器 的相关文章

  • DOM Range 克隆不能免受 DOM 更改的影响

    我正在使用 cloneRange 函数克隆 DOM Range 如果我然后像这样修改原始范围对象 range setStart range startContainer 1 克隆保留了旧的startOffset正如预期的那样 但是 如果我修
  • javascript中的实时文本颜色变化[重复]

    这个问题在这里已经有答案了 可能的重复 使用Jquery改变Textarea中某些单词的颜色 https stackoverflow com questions 2990157 change the color of certain wor
  • 如何获取当前页面样式表作为字符串?

    假设我当前的页面如下所示 我想
  • 两个同时发生的事件

    我在这个页面上使用了一段JS代码http 200tr ru app admin http 200tr ru app admin 当我按下十字符号时 会发生 2 个事件 模糊和单击 但仅运行模糊代码 我需要反点击交叉代码 我怎样才能做到这一点
  • JS:event.touches 属性如何工作?

    我不明白如何使用 event touches 属性 例如 要获取 iPad iPhone 上的手指数量 您应该使用 event touches length 那么为什么这个示例代码不起作用呢 image bind touchstart fu
  • React Material UI 1.0 在更改时选择多个参数

    我正在使用 React Material Ui 1 0 0 beta 34 并且 Select 组件有问题 我正在尝试设置附加参数onChange事件处理程序 但看起来只允许传递事件参数 这就是我的自定义选择组件的样子 import Rea
  • Nuxt.js 中的条件模块加载

    我的 Nuxt js 配置中有一个 Google 跟踪代码管理器模块 如下所示 modules nuxtjs google tag manager id GTM XXXXXXX 这工作正常 但我想知道如何根据站点设置的 cookie 值有条
  • Angular 2 App测试,如何访问和操作html元素?

    我有一个 Angular 2 前端需要测试 我在一个网站上找到了 https kendaleiv com angular 2 component testing template using testbed https kendaleiv
  • Tampermonkey 用户脚本可以访问 Chrome API 吗?

    我正在开发一个需要的用户脚本chrome对象 但我无法访问它 如何访问chrometampermonkey 用户脚本中的对象 也许 清单中的一些权限或者什么 参考Chrome 扩展代码 vs 内容脚本 vs 注入脚本 https stack
  • DevTools 无法解析 SourceMap

    我正在尝试让我的 Webpack 项目拥有源映射文件 我终于得到了正确的设置 以便它可以做到这一点 但现在我收到此错误 DevTools 无法解析 SourceMap http MyServer MyApp bundle js map ht
  • Chart.js 不显示图表数据时的默认值

    我正在使用 Chart Js 来显示我的图表 我通过 ajax 获取图表数据并以图形方式呈现它以显示数据 我的问题是 在极少数情况下 我的 Ajax 不返回任何内容 而我的图表仅显示 X 轴和 Y 轴 没有数据或没有显示图例 有没有显示默认
  • JavaScript 中的 touchstart 不再返回 TouchList

    我遇到了一个非常奇怪的问题 我正在绑定touchstart事件到一个元素 并且想要检索事件的 X 和 Y 坐标 全部文档 http developer apple com library safari documentation apple
  • 如何使用角度在垫选择嵌套值中包含过滤器

    我正在使用带有嵌套下拉菜单的有角材料 下拉值以父级和子级为基础嵌套 我面临两个问题 自动建议不起作用 如果我输入父名称或其关联的子名称 则必须以展开模式过滤并显示特定的父视图 如果我展开第一个父视图并尝试展开第二个父视图 则第一个父视图应在
  • 请使用同一按钮播放和暂停音频

    我有这段代码并且只是播放 但我想使用相同的按钮 图像 播放和暂停 并且我不知道我需要添加什么 我需要做什么 请帮帮我
  • 如何告诉 Sonar 使用我的可靠报告来获取单元测试结果

    我们有一个 Jenkins 作业 其中包含一堆 javascript 文件 我们通过 grunt 构建项目 并在构建结束时运行 JSCover 来运行单元测试并收集代码覆盖率 这一切都有效 我们得到了一个不错的 LCOV 文件 并且在 ta
  • 切换 Ag-Grid 中的浮动过滤器?

    我试图通过开关或按钮单击来确定浮动过滤器的显示 看起来很简单 我应该能够在 true 和 false 之间切换 将该值提供给网格选项中的浮动过滤器 然后刷新标题 对吗 不幸的是 网格似乎总是落后一步 当我第一次点击时 什么也没有发生 当我将
  • 将 Babel 与单个输出文件和 ES6 模块一起使用

    这是我的 gulp 任务 将 ES6 代码编译成单个 ES5 文件 我使用类和模块 import export 在 ES6 中 gulp src paths scripts pipe sourcemaps init pipe babel p
  • 为什么这个 fs.readFile 循环没有将其结果推送到我的数组? [复制]

    这个问题在这里已经有答案了 usr bin env node var fs require fs async require async program require commander program version 0 0 1 usa
  • 递归process.nextTick警告

    作为我的应用程序的一部分 我有以下代码行 process nextTick function pre populate cache with all users console log scanning users table in ord
  • 在浏览器开发工具中看不到SignalR流量

    我构建了使用 SignalR 的服务器和客户端代码 该网站运行完美 但我无法在任何浏览器 chrome IE Firefox 中看到网络流量 我知道网络流量在那里 因为该网站正在运行 有没有办法在浏览器中查看 SignalR 流量 如果不是

随机推荐

  • 通过静态类访问 HttpContext 可以“正确”处理不同的请求

    I found 本文 https www quickdevnotes com better approach to use httpcontext outside a controller in net core 2 1 在尝试解决需要非控
  • 图片上传:iPhone客户端-Django-S3

    我有一个关于从客户端 在本例中为 iPhone 应用程序 上传到 S3 的一般性问题 我正在使用 Django 在 EC2 实例上编写 Web 服务 以下方法是将文件上传到 S3 的最低限度方法 对于较小的文件 jpg 或 png def
  • 判断手机是否重启过

    我正在尝试检测自上次设置首选项值以来 Android 设备是否已重新启动 理想情况下 我想在没有android permission RECEIVE BOOT COMPLETED允许 我考虑的一种方法是存储另一个包含某种会话 ID 的首选项
  • 是否有更好的方法来处理穿过反子午线(日界线)的空间多边形?

    TL DR R中处理在纬度 180 处与反子午线相交 重叠的空间多边形并将其沿该子午线切割成两部分的最佳方法是什么 Preface 这将是一篇很长的文章 但只是因为我将包含大量代码和图形来进行说明 我将向您展示我的目标是什么以及我通常如何实
  • 有没有办法改变海龟中文本框的位置?它总是显示在我的左上角,但我希望它出现在底部中心

    import turtle screen turtle Screen global answer answer screen textinput Welcome to the game What s your name Here is 出现
  • 使用 angularjs 将数据附加到 json-ld

    我是 angularjs 的新手 我开始这个项目是为了了解有关这个框架的更多信息 我制作了一个将数据放入 json ld 的应用程序 我的应用程序可以将数据添加到 json ld 但没有我想要的输出格式 这个 gt 这是我的 html和角度
  • MySQL获取最新记录检查两列[重复]

    这个问题在这里已经有答案了 我有这样的结果 我需要获取每个骑师的最新比赛 首先获取比赛的最大日期 然后获取最大比赛编号 结果应该是这样的 注 数据库非常庞大 查询应该非常快 当您说 最大比赛号码 时 您是指最新比赛的号码 日期最近的比赛 还
  • 自定义 HighCharts 中各个系列的颜色

    我正在使用 HighCharts 绘制折线图 并尝试更改每个系列的线条颜色 我确实找到了这个例子here https stackoverflow com questions 5727419 highcharts is it possible
  • iOS - 获取字母的“真实”高度

    我正在尝试在 UIView 上布局文本 黄色区域是带有背景色的UILabel的边框 当我使用 sizeWithFont 时 我得到了这个 它在字母上方有一个非常大的空间 当我使用font pointSize我得到这个 i 这很好 BUT当我
  • MySQL 数据库中有一列 LONGTEXT 的内存消耗

    我正在 MySQL 数据库中创建一个日志表 其中一个字段将仅在大约 5 的日志中使用 并将包含堆栈跟踪和其他供开发人员使用的冗长信息 我正在考虑使用 LONGTEXT 字段 但我想知道使用它是否会使我的数据库增长得非常快 即使该列中有 95
  • 任何生成 xsl:fo 的 javascript(基于网络)所见即所得编辑器

    我很难找到可生成 XSL FO 的 OSS 或基于商业网络 javascript 的 WYSIWYG 编辑器 我希望编辑能够做 向用户呈现常见的文本编辑器界面 与我当前正在输入以向 SO 提交此问题的编辑器不同 用户能够定义 XSL FO
  • 禁用 jQuery UI Datepicker 中的未来日期

    是否可以禁用从今天开始的未来日期 假设今天是 2010 年 10 月 23 日 那么 2010 年 10 月 24 日以后将被禁用 抱歉 我对 jQuery 和 JavaScript 很陌生 确实是的 日期选择器具有 maxdate 属性
  • 反应原生模态,避免在键盘打开时调整视图大小(Android)

    我正在使用react native Modal 其中包含一个View 该视图有一些 TextInput 元素 当键盘弹出时 视图元素全部折叠以适应剩余空间 但我根本不希望视图发生变化 这确实not发生在IOS上 而且 它确实not发生在同一
  • 如何管理多个 apache 服务器上的单个 PHP5 会话?

    您好 我必须从多个网络服务器检索数据 首先 我以用户身份登录我的网站 成功登录后 我必须从不同的网络服务器获取数据并显示 如何与多个服务器共享单个会话 我怎样才能实现这个目标 当我第一次登录时 它会创建会话并将会话 ID 保存在该服务器的临
  • 如何通过环境变量添加气流池?

    就像可以通过名称后面的环境变量设置连接一样AIRFLOW CONN conn id 有没有办法设置池 这样我就可以设置一个本地 Docker 测试环境 并填充所有配置 None
  • AdMob 插页式广告已显示但无法点击

    我有一个应用程序 可以在某些活动关闭时显示插页式广告 我使用不同的活动来展示广告 到目前为止 它正确显示了广告 但当我点击广告时没有任何反应 我已经在许多设备上进行了测试 测试人员报告了相同的行为 日志中没有错误 如果我使用调试版本或上传到
  • Delphi 中图标的线程加载

    使用Delphi 2009 尝试制作一个启动器 为了使其 敏捷 我真的很想在后台线程中加载图标 我已经使用了这里找到的解决方案 能否从 Vista Shell 获取 48x48 或 64x64 图标 https stackoverflow
  • 如何将 gecko 可执行文件与 Selenium 一起使用

    我使用的是 Firefox 47 0 和 Selenium 2 53 最近 Selenium 和 Firefox 之间出现了一个 bug 导致代码无法运行 解决方案之一是使用 Marionnette 驱动程序 我按照这个指示site htt
  • 我可以使用 VS2010 PrivateObject 访问静态类中的静态字段吗?

    是否可以使用 VS2010 单元测试类 PrivateObject 访问静态类中的私有静态字段 假设我有以下课程 public static class foo private static bar 我可以使用 PrivateObject
  • Javascript 中的任务运行器

    我有一个任务列表 只有在解决每个任务的所有依赖关系后才需要执行所有这些任务 我正在努力找出一种方法来在最佳时间完成所有任务 Each node is a async job illustrated by setTimeout A and C