J'ai publié une bibliothèque appelée sync-actions qui permet aux processus asynchrones d'être exécutés de manière synchrone en JavaScript/TypeScript. Surtout dans TypeScript, vous pouvez appeler des fonctions définies de manière sécurisée. Il est destiné à être utilisé dans les cas où vous souhaitez exécuter des processus asynchrones au sein de fonctions que vous ne voulez pas (ou ne pouvez pas) marquer comme asynchrones.
https://github.com/koyopro/sync-actions
Il est publié sous forme de package npm, veuillez donc l'installer à l'aide de npm install ou similaire.
npm install sync-actions
En passant une fonction asynchrone qui renvoie un objet Promise à definitionSyncWorker(), vous pouvez définir l'interface et démarrer le thread de travail avec launch(). On suppose que le fichier définissant le travailleur est créé séparément des autres fichiers de traitement.
// worker.js import { 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.js import { actions, worker } from "./worker.js"; // You can execute asynchronous functions synchronously console.log(actions.ping()); // => "pong" is output after 1 second worker.terminate();
Dans TypeScript, vous pouvez appeler les fonctions définies avec définirSyncWorker de manière sécurisée.
// worker.ts import { 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<number> => { return a + b; } }).launch();
// main.ts import { actions, worker } from "./worker.js"; // Type-safe call actions.add(1, 2); // => 3 (number) // @ts-expect-error actions.add("1", 2); // => Argument of type 'string' is not assignable to parameter of type 'number' worker.terminate();
Le contenu jusqu'à présent est le même que celui du README, je vais donc décrire le contexte de sa création.
Je développe un ORM appelé Accel Record.1 Contrairement aux ORM généraux, Accel Record est conçu pour effectuer un accès à la base de données avec une interface synchrone.2 La partie qui exécute l'accès à la base de données de manière synchrone. a été réalisé en exécutant des processus asynchrones dans un sous-processus démarré avec le module child_process.3 Je pensais qu'en utilisant work_threads au lieu de child_process, je pourrais réduire la surcharge au moment de l'exécution.
Accel Record est également conçu pour être similaire à Active Record de Ruby on Rails en termes de convivialité, et l'une des choses que je souhaite réaliser à l'avenir est de créer une bibliothèque comme CarrierWave. CarrierWave vous permet d'enregistrer des images sur des services de stockage externes (tels qu'AWS S3) lors de l'enregistrement d'enregistrements, et pour y parvenir avec Accel Record, il est nécessaire d'exécuter des processus asynchrones tels que le téléchargement d'images de manière synchrone. Je m'attends à ce que ce processus puisse être exécuté plus rapidement en utilisant work_threads au lieu de sous-processus.
J'ai donc cherché une fois une bibliothèque qui exécute de manière synchrone des processus asynchrones à l'aide de worker_threads. J'ai trouvé plusieurs bibliothèques telles que synckit et deasync, mais aucune d'entre elles n'a fonctionné comme prévu de mon côté, j'ai donc décidé de créer la mienne. Depuis que j'y étais, j'ai pensé créer une interface pouvant être utilisée de manière sécurisée avec TypeScript.
Introduction à "Accel Record" : un ORM TypeScript utilisant le modèle d'enregistrement actif ↩
Pourquoi nous avons adopté une API synchrone pour le nouvel ORM TypeScript ↩
Techniques d'accès synchrone à la base de données dans TypeScript ↩
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!