发布了一个用于 JS/TS 异步进程同步执行的库

发布了一个用于 js/ts 异步进程同步执行的库

我发布了一个名为sync-actions 的库,它允许异步进程在 javascript/typescript 中同步执行。特别是在 typescript 中,您可以以类型安全的方式调用定义的函数。它适用于您想要在您不希望(或不能)标记为异步的函数中执行异步进程的情况。

特征

利用 node.jsworker_threads异步进程在子线程中执行,主线程同步等待其完成。类型安全的函数调用在 typescript 中,您可以利用已定义函数的类型信息。作为原生 esm 发布由于不支持 commonjs,它变得简单。

存储库

https://github.com/koyopro/sync-actions

用法

安装

它作为 npm 包发布,因此请使用 npm install 或类似的方式安装它。

npm install sync-actions

基本用法

通过将返回promise对象的异步函数传递给definesyncworker(),您可以定义接口并使用launch()启动工作线程。假设定义工作程序的文件是与其他处理文件分开创建的。

// worker.jsimport { definesyncworker } from "sync-actions";export const { actions, worker } = definesyncworker(import.meta.filename, {  ping: async () => {    // execute asynchronous process,    await new promise((resolve) => settimeout(resolve, 1000));    // return the result as a return value    return "pong";  }}).launch();
// main.jsimport { actions, worker } from "./worker.js";// you can execute asynchronous functions synchronouslyconsole.log(actions.ping()); // => "pong" is output after 1 secondworker.terminate();

类型安全的函数调用

在 typescript 中,您可以以类型安全的方式调用使用 definesyncworker 定义的函数。

// worker.tsimport { definesyncworker } from "sync-actions";export const { actions, worker } = definesyncworker(import.meta.filename, {  // by specifying the types of arguments and return values, type-safe calls are possible  add: async (a: number, b: number): promise => {    return a + b;  }}).launch();
// main.tsimport { actions, worker } from "./worker.js";// Type-safe callactions.add(1, 2); // => 3 (number)// @ts-expect-erroractions.add("1", 2);// => Argument of type 'string' is not assignable to parameter of type 'number'worker.terminate();

背景

到目前为止的内容与readme相同,所以我将描述它的创建背景。

我正在开发一个名为 accel record 的 orm。1与一般 orm 不同,accel record 旨在通过同步接口执行 db 访问。2 同步执行 db 访问的部分是通过在以child_process模块​​启动的子进程中执行异步进程来实现的。3我认为通过使用worker_threads而不是child_process,我可以减少运行时的开销。

accel record 在可用性方面也被设计为类似于 ruby on rails 的 active record,而我未来想要实现的目标之一就是创建一个像 carrierwave 这样的库。 carrierwave允许您在保存记录时将图像保存到外部存储服务(例如aws s3),而要使用accel record来实现这一点,需要同步执行图像上传等异步过程。我希望通过使用worker_threads而不是子进程可以更快地执行这个进程。

所以我曾经寻找过一个使用worker_threads同步执行异步进程的库。我发现了几个库,例如synckit和deasync,但它们都没有按照我的预期工作,所以我决定创建自己的库。从那时起,我就想制作一个可以通过 typescript 以类型安全方式使用的界面。

更多内部细节

直到以worker_threads启动的子线程中的异步进程完成为止,使用atomic.wait()阻塞主线程。messagechannel 用于线程之间的通信。 synckit的源码对于这部分的实现非常有帮助。当使用worker_threads启动worker时,需要将.ts文件转译为.js。对于这部分,我使用 esbuild。启动 worker 时,我想将转译后的源代码作为字符串传递给 worker 执行,但它在我的环境中无法正常工作。这是我最挣扎的部分。最后,我将文件写在node_modules下,并将其路径传递给worker。这个方法被证明是最稳定的。

“accel record”简介:使用 active record 模式的 typescript orm ↩

为什么我们为新的 typescript orm 采用同步 api ↩

typescript 中的同步数据库访问技术↩

以上就是发布了一个用于 JS/TS 异步进程同步执行的库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 21:53:04
下一篇 2025年12月19日 21:53:18

相关推荐

  • 将 Golang 延迟概念实现到 Javascript 中

    在 go 中,defer 语句推迟函数的执行,直到周围的函数返回。这是一个简单的例子: package mainimport “fmt”func main() { fmt.println(“start”) defer fmt.println(“defer 1”) defer fmt.println(…

    2025年12月19日
    000
  • Integration Testing: Ensuring Seamless Software Interactions

    什么是集成测试 集成测试是软件测试生命周期中的关键阶段,旨在确保系统的不同模块按预期协同工作。单元测试验证各个组件,而集成测试则侧重于这些组件之间的通信和交互。本博客探讨了集成测试的重要性、类型、工具、挑战和最佳实践,全面了解其在交付高质量软件中的作用。 为什么集成测试很重要? 集成测试有助于识别组…

    2025年12月19日
    000
  • JavaScript:编程语言的“英语”

    虽然我是后端开发人员,但我的主要编程语言是 JavaScript,原因很简单:JavaScript 和英语一样,有许多不一致、历史怪癖和缺陷,但它无处不在。 阿特伍德定律:“任何可以用 JavaScript 编写的应用程序最终都将用 JavaScript 编写”。 几乎每部手机和计算机上都有一个 J…

    2025年12月19日
    000
  • 掌握 JavaScript 装饰器

    javascript 装饰器是一项强大的功能,可以简化代码并增强可读性,特别是在处理复杂的应用程序时。在这篇博客中,我们将通过实际示例来简化装饰器,使高级开发人员更容易有效地实现它们。 什么是 javascript 装饰器? 装饰器是一种用于修改类及其成员的特殊语法。它们是可应用于类、方法或属性的函…

    2025年12月19日
    000
  • JavaScript 循环综合指南

    JavaScript 循环结构 这份指南将深入探讨 JavaScript 中各种循环结构及其用法,并附带示例代码。 1. for 循环 当循环次数已知时,for 循环是最佳选择。 语法: for (let i = 0; i < 10; i++) { // 代码块} 示例: for (let i…

    2025年12月19日
    000
  • 掌握 JavaScript 中的 JSON 处理:解析和字符串化

    JavaScript JSON 处理:解析与字符串化详解 JSON (JavaScript 对象表示法) 是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。JavaScript 内置方法可实现 JSON 字符串与 JavaScript 对象的相互转换。 1. 解析 JSON 字符…

    2025年12月19日
    000
  • JavaScript 中字符串操作综合指南

    javascript 中的字符串操作 字符串操作是 javascript 中文本处理的核心方面。 javascript 提供了一组丰富的内置方法和技术来处理和转换字符串。 1.创建字符串 javascript 中的字符串可以使用单引号 (‘)、双引号 (“) 或反引号(` 用…

    好文分享 2025年12月19日
    000
  • 我如何开始作为 MERN 堆栈开发人员的旅程

    简介: “我记得第一次遇到 MERN Stack 这个术语时——MongoDB、Express.js、React.js 和 Node.js。我不知道这些工具是什么,但我知道如果我能掌握它们,我就能够构建一些令人惊叹的网络应用程序。这是我如何从初学者到深入研究 MERN Stack 开发世界的故事。”…

    2025年12月19日
    000
  • 了解 Protocol Buffers:JSON 的快速替代方案

    在数据交换领域,json(javascript 对象表示法)一直是人们的最爱。它简单、易读,并且可以跨平台无缝运行。对于许多用例来说,json 已经“足够好”。但随着系统规模的扩大以及对速度和效率的需求的增加,json 基于文本的格式可能会成为瓶颈。 这就是 protocol buffers (pr…

    2025年12月19日
    000
  • 高级 JavaScript 概念 Promise、async/await 和 try-catch

    第 8 天:高级 javascript 概念 日期:2024 年 12 月 15 日 欢迎来到第八天!今天,我们探讨一些最强大、最先进的 javascript 概念,这些概念可以提高您的编程技能。其中包括现代 es6 功能、使用 promise 和 async/await 的异步编程,以及使用 tr…

    2025年12月19日
    000
  • 大 O 符号

    它是一种表示法,决定算法运行的速度有多快或多慢。这个速度不是由秒决定的,而是由算法的运行时间随着元素的增加而增加多少决定的。 大o是时间和大小的关系。在整篇文章中,您将看到包含这些度量的图表,并且您将在实践中更好地理解它们。我们有两种类型的复杂性(空间和时间)。 时间复杂度: 确定执行与输入大小成正…

    2025年12月19日 好文分享
    000
  • 如何通过代码分割提高 React 应用程序的性能

    随着 react 应用程序的大小和复杂性不断增长,其 javascript 包的大小会显着影响性能,尤其是在较慢的网络或设备上。缓解此问题的一种有效方法是通过代码拆分,这是一种将应用程序分解为更小的块的技术。这些块按需加载,减少了初始加载时间并提高了整体性能。 在本文中,我们将探讨什么是代码分割、为…

    2025年12月19日
    000
  • Documenso 和 aws-smage-upload 示例之间的 Spload 功能比较

    在本文中,我们将比较 documenso 和 aws s3 图像上传示例之间将文件上传到 aws s3 所涉及的步骤。 我们从 vercel 提供的简单示例开始。 示例/aws-s3-image-upload vercel 提供了一个将文件上传到 aws s3 的良好示例。 此示例的自述文件提供了两…

    2025年12月19日
    000
  • 掌握重做快捷键:生产力指南

    在当今快节奏的数字世界中,掌握键盘快捷键对于提高生产力和效率至关重要。虽然许多人熟悉复制、粘贴和撤消等常见快捷键,但重做快捷键通常没有得到应有的关注。本博客详细探讨了重做快捷方式,包括其用法、变体以及帮助您更智能地工作的提示。 重做快捷键是什么? 重做快捷键是撤消“撤消”操作的快速方法,让您无需手动…

    2025年12月19日
    000
  • 为什么 React 中的 Props 是不可变的?

    为什么 react 中的 props 是不可变的? 在 react 中,props 被认为是不可变的,因为它们的值无法更改。 props 主要用于将数据从父组件传递到子组件。 react 确保 props 保持不可变,以防止任何组件意外或故意修改从其父级接收的数据。这种不变性强化了单向数据流的概念。…

    2025年12月19日
    000
  • 使用 Nextjs Tailwind CSS、Prisma、Open AI 和 Clerk 构建的 AI 旅行规划应用程序

    人工智能旅行规划师 使用 next.js 15、tailwind css、prisma、open ai 和 clerk 构建的 ai 旅行规划应用程序。功能包括用户注册、登录、生成旅行计划、查看所有旅行计划和删除行程。在开发过程中接受贡献。 入门 克隆存储库:git clone https://gi…

    2025年12月19日
    000
  • 感谢您的记忆

    认识我的人都知道我的记忆力绝对是垃圾。任何缺少 monty python 对白和 90 年代另类摇滚乐队曲目列表的内容,我都无法接受。 然而,对我们来说幸运的是,计算机在记住事物方面的能力要强得多。 概念 我们今天讨论的技术称为记忆化。让我们从讨论纯函数开始。纯函数背后的想法是,无论你给它什么输入,…

    2025年12月19日
    000
  • LeetCode 的 JavaScript 时代实际上填补了空白

    大多数编码挑战都会教你解决难题。 leetcode 的 30 天 javascript 学习计划做了一些不同的事情:它向您展示了拼图如何变成砖块,准备好构建现实世界的项目。 这种区别很重要。当您解决典型的算法问题时,您正在训练您的思维进行抽象思考。但是,当您实现去抖1函数或构建事件发射器2时,您正在…

    2025年12月19日
    000
  • 在 React JS 项目中设置 Tailwind CSS

    如果您还没有 react 应用程序,请创建一个: npx create-react-app my-appcd my-app 安装 tailwind css运行以下命令安装 tailwind css 及其依赖项: npm install -d tailwindcss postcss autoprefi…

    2025年12月19日
    000
  • agilbo 让敏捷项目管理变得轻松

    在当今快节奏的商业世界中,适应性和效率对于成功至关重要。企业不仅必须提供高质量的产品,还必须快速响应不断变化的需求。敏捷产品项目管理已成为一种改变游戏规则的方法,使团队能够协作、适应并交付卓越的结果。 Agilibo 凭借其创新平台,提供了完美的工具包来支持企业采用敏捷方法并实现其目标。 了解敏捷产…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信