教你以 Node.js 方式编写单例 - 网站

教你以 Node.js 方式编写单例

分类:Node.js 教程 · 发布时间:2020-09-22 15:02 · 阅读:1311

以 Node.js 方式编写单例

文 / Victor - AfterShip

译 / 吴天成 - AfterShip

问题描述

以下面这种方式,写单例很容易:

let someModule
async getSomeModule() {
    if (!someModule) {
        someModule = await someAsyncOperationsToInitializeModule()
    }
    return someModule
}
module.exports = getSomeModule

通常以这种方式使用它:

// in async function
const getSomeModule = require('./getSomeModule')
const someModule = await getSomeModule()

除非你希望将模块的加载延迟到初次运行时,否则不鼓励这种方式。

因为,这将带来很多没必要的分支代码(例如,if statement ),实际上我们希望避免这种代码。而且使用 let 语法将会中断静态代码分析,导致 IDE 不能正确推导出 someModule 的类型。

解决方案 A

请注意,node 的模块系统默认为单例(模块在第一次 required 的时候将会被缓存 [1])。所以一旦一个 promise 被 resolved 并导出,无论谁 require(加载) 模块,它将始终返回第一次 resolved 的结果。

以下是只使用 const 来实现的方式:

// NodeJs 方式的 async 单例
// someAsyncOperationsToInitializeModule 为 async function
// 注意,此处执行函数,未 await
const someModule = someAsyncOperationsToInitializeModule()
module.exports = someModule

2 行代码,就够了。

你该如何使用这个模块呢?

// in async function
// 不要用 "await getSomeModule()", 你不需要 `()`
const getSomeModule = require('./getSomeModule')
const someModule = await getSomeModule
someModule 的值绝对与【问题描述】中提到的代码运行结果完全相同。

你可能会注意到文件名最好更改为 ./someModule.js 或 ./asyncSomeModule.js .

另外一个可能会提出的问题是,我们已经使用了 await getSomeModule() ,但是在当前方案中,被调整为了 await getSomeModule。如果我们采用这种解决方案,将会对现有代码造成很大的影响。

其实,只需要做一点点调整,就可以保持之前的文件命名和调用方式。

解决方案 B

// NodeJS 方式的 async 单例
const someModule = someAsyncOperationsToInitializeModule()
module.exports = () => someModule

现在,你无需改变任何外部代码。这种实现 100% 向后兼容。也就是说,你无需改造模块的调用方式,正如问题中所提到的调用方式一样。

// in async function
const getSomeModule = require('./getSomeModule')
const someModule = await getSomeModule()

Show me the Code

https://repl.it/@victoratas/Singleton-in-Nodejs

补充资料

https://nodejs.org/api/modules.html#modules_caching

原文地址:https://learnku.com/articles/46091

标签:
Node.js

相关文章

Node.js是什么?有什么优势?有什么用途?

Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。

深入浅析Node.js中的异步生成器和异步迭代

生成器函数在 JavaScript 中的出现早于引入 async/await,这意味着在创建异步生成器(始终返回 Promise 且可以 await 的生成器)的同时,还引入了许多需要注意的事项。今天,我们将研究异步生成器及其近亲——异步迭代。

Node+Redis进行API速率限制的方法介绍

速率限制可以保护和提高基于API的服务的可用性。如果你正在与一个API对话,并收到HTTP 429 Too Many Requests的响应状态码,说明你已经被速率限制了。这意味着你超出了给定时间内允许的请求数量。你需要做的就是放慢脚步,稍等片刻,然后再试一次

在Deno中使用 Node 模块

Deno 是基于 Web 技术的服务器端代码执行环境。Node 使用 JavaScript 与 commonjs 模块,并把 npm/yarn 作为其包管理器。

30分钟内构建Node.js API

本教程是 Node.js,Express 框架和 MongoDB 的快速指南,重点介绍基本的 REST 路由和基本的数据库交互。你将构建一个简单的 API 框架模版,然后可以将其用作任何应用。

返回分类 返回首页