当所有 Readline on('line') 回调完成时退出流程

2023-11-29

我有一个 Node v10.14.1 程序,它使用以下命令逐行读取 CSV 文件读取线接口

My .on('line') is an async回调执行一些从数据库读/写的操作,因此我使用async/await来处理承诺。

该程序感兴趣的代码块的简短版本如下所示:

const readline = require('readline');
const filesystem = require('fs');

const reader = readline.createInterface({
    input: filesystem.createReadStream(pathToSomeCSV)
});

reader.on('line', async (line) => {
  await doSomeDBStuff();
})

如果我保持上面的原样,该过程不会退出。然而,如果我

reader.on('close', () => {process.exit()});

然后进程在所有之前退出on('line')回调完成并且它们的承诺得到解决。

我的问题是:有没有办法说“在读取所有行并且所有on('line')回调完成并解决了他们的承诺,然后退出该过程(我假设process.exit())"?


调查

我感觉文档遗漏了一些不明显的细节。我无法得到这个官方的例子工作正常(这就是你的问题似乎基于的)。该实现会过早地终止我的应用程序。或者,如果我删除了'close'听众,终端将在退出时永远挂起。我尝试覆盖process.on('exit')无济于事。我也尝试过提示同步包,但它始终损坏我的终端。

Solution

I found 这里有一个可爱的答案这提供了一个很好的解决方案。

创建函数:

const prompt = msg => {
  fs.writeSync(1, String(msg));
  let s = '', buf = Buffer.alloc(1);
  while(buf[0] - 10 && buf[0] - 13)
    s += buf, fs.readSync(0, buf, 0, 1, 0);
  return s.slice(1);
};

Use it:

const result = prompt('Input something: ');
console.log('Your input was: ' + result);

没有终端损坏,应用程序不会过早终止,也不会在退出时挂起。

然而,这个解决方案并不完美 - 它在等待用户输入时故意阻塞主线程,这意味着您在等待用户输入时无法在后台运行其他函数。在我看来,用户输入在大多数情况下应该是线程阻塞的,所以这个解决方案对我个人来说非常有效。

Edit:查看 Linux 的改进版本here.

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

当所有 Readline on('line') 回调完成时退出流程 的相关文章

随机推荐

  • 对 IText 7 中的所有 PDF 页面使用单一模板

    我有以下内容PDF模板这对于所有的应该是一致的pages添加到我正在创建的 PDF 中 问题是 我只得到这个模板Page 1仅适用于其余页面空白模板已使用 这是现在正在使用的代码 PdfDocument pdfDoc new PdfDocu
  • 在 Java 中对从数据库检索的一小部分数据执行连接操作。 (上下文:网络应用程序)

    在 Web 应用程序的上下文中 是否适合在 Java 中对从数据库检索的数据 从第一个查询 执行一些 JOIN 操作 并使用该 JOIN 数据进行第二个也是最后一个数据库查询以获得所需的数据 Java 是否为此类实现提供任何内置机制 或者实
  • Laravel 5.2 通过 API 进行身份验证

    我正在使用 Laravel 5 2 开发 RESTful API 在令牌守卫中位于 Illuminate Auth TokenGuard TokenGuard php在第 46 行 标记的列名称定义为api token this gt st
  • Selenium 测试在本地工作但在 Jenkins 中失败

    在工作中 我们为我们的一个应用程序提供了一个自动化套件 该套件设置为在每次提交到 master 部署到产品时运行 并且很长一段时间以来 我们一直在尝试使其足够可靠 测试在 Jenkins 中运行 使用 Selenium webDriver
  • 如何在 Android Canvas 上制作路径动画

    是否可以将动画师附加到路径上 还有其他方法可以在画布上绘制动画线条吗 我在发布之前搜索过此内容 但找不到任何内容 在另外两篇文章中在 Android 的 Canvas 上绘制路径作为动画 and 如何在 Android Canvas 上用动
  • 使用JS或Jquery读取css比例值

    我有这个div div div 我如何获得 transform scale x y 使用 JS 或 jQuery 的元素 id css transform 给我矩阵 但我需要元素的实际比例值 或者 如果我无法直接获得比例 那么将矩阵 转换为
  • Fortran 中不区分大小写的字符串比较

    尽管 Fortran 不区分大小写 但我观察到使用以下命令比较字符串时情况并非如此if查看 当然 用户应该意识到这一点 然而 Fortran 不区分大小写 我潜意识里希望同样适用于字符串检查 实现不区分大小写的字符串比较的有效方法是什么 这
  • ld 在 OSX Leopard 上找不到 X11 库

    我有一个在 Linux 上运行的非常基本的 X11 应用程序 我试图在 OSX 10 5 8 下编译它 我已经安装了X11和X11 SDK 并修改了makefile如下 CFLAGS L usr X11 lib I usr X11 incl
  • 如何从DataFrame中获取Array[Seq[String]]?

    如何通过DataFrame cc into Array Seq String val factors ccCols split val cc dataset select factors head factors tail 我尝试过这种方式
  • 扩展 Typescript 中的内置类型

    我有以下结构 project types global d ts string d ts wdio d ts src Models Resources Components Extensions string ts tsconfig jso
  • 使用 CURRENT_TIMESTAMP 的 Rails 5.2 和 Active Record 迁移

    我有一些属性需要有默认值 我已经设置了迁移以在数据库中设置默认值 如下所示 class AddDefaultsToModel lt ActiveRecord Migration 5 2 def change change column po
  • 如何使用 Perl 动态获取 Web 内容?

    这有点棘手 我猜这个网页使用某种 AJAX 来根据搜索查询提取内容 当我在 Perl 中使用 get 获取页面时 它会获取 php html 后面的脚本代码 但不会获取手动搜索查询时显示的结果 我需要能够获取结果页面的内容 无论如何 在 P
  • iOS 中的视频编辑问题

    我目前正在开发一个 iOS 应用程序 它可以合并所需数量的视频 一旦用户点击按钮来合并视频 视频就会被合并 然后使用 AVPlayer 进行播放 如下所示 CMTime nextClipStartTime kCMTimeZero NSInt
  • fetchUuidWithSdp 始终给出缓存的 UUID

    我正在编写一个应用程序 其中我必须在选定的设备上进行服务发现 但每当我执行 fetchUuid 时 它总是为我提供远程设备上缓存的 UUID 这就是我正在尝试的 public boolean UUIDsearch BluetoothDevi
  • Google Cloud Storage Python list_blobs() 不打印对象列表

    我是 Python 和 Google Cloud Storage 新手 我正在编写一个 python 脚本 以使用 Google Cloud Python 客户端库从 Google Cloud Storage 存储桶获取文件列表 而 Buc
  • MvvmCross UITextField 自定义绑定

    所以我试图在 MvvmCross 中实现 UITextField 的自定义绑定 几乎遵循以下方式绑定软件键盘上的 GO 键 即尝试绑定一个文本字段 以便在点击键盘上的 完成 按钮时自动触发事件 因此绑定到ShouldReturn 我还需要绑
  • Neo4j“没有依赖项满足类型类 org.neo4j.kernel.api.index.SchemaIndexProvider”

    Neo4j 社区 2 3 3 Linux Ubuntu 14 04 尝试运行一个使用 Kafka 主题的 Java 应用程序 在查询 Neo4j 时处理其消息 并将它们写入另一个 Kafka 主题 hduser ubuntu java ja
  • GridView - 在空数据源上显示标题

    在 C 中 即使数据源为空 如何仍然显示 gridview 的标题 我不会自动生成列 因为它们都是预定义的 目前我正在做的事情如下 从存储过程中获取 DataTable 然后设置 gridview 的 DataSource 然后调用 Dat
  • 将 css、js 或其他内容从部分视图添加到视图头

    我发现了一些与此相关的问题 但通常有很多不同的答案 而且它们看起来都非常混乱和复杂 如果这就是需要做的 那么好吧 我最好坐下来解决它 我想知道最简单 最有效的方法是将内容从部分视图添加到您的头脑中 我需要这样做的原因是我需要在每个页面上使用
  • 当所有 Readline on('line') 回调完成时退出流程

    我有一个 Node v10 14 1 程序 它使用以下命令逐行读取 CSV 文件读取线接口 My on line is an async回调执行一些从数据库读 写的操作 因此我使用async await来处理承诺 该程序感兴趣的代码块的简短