具有单例设计模式的 NodeJS 异步 class
NodeJS async class with singleton design pattern
问题:
在 class 中使用异步调用实现单例设计模式。将模块导入第二个文件时无法获取值。
案例:
最终我想在它过期时为不记名令牌更新实现这个逻辑。我有多个依赖令牌的功能。因此,当我收到 403 时,我将更新令牌,所有其他功能也可以访问此更新的令牌。
脚本 1:
//File1.js
import axios from "axios";
async function getJson(n) {
const req = await axios.get(
`https://jsonplaceholder.typicode.com/todos/${n}`
);
return req.data.title;
}
class Todo {
constructor() {
if (Todo.instance == null) {
this.title;
Todo.instance = this;
}
return Todo.instance;
}
async init() {
this.title = await getJson(1);
}
async updateTodo(n) {
this.title = await getJson(n);
}
getTodo() {
return this.title;
}
}
const todo = await new Todo().init();
export default todo;
脚本 2:
const todo = await import('./File1.js');
console.log(todo); //[Module: null prototype] { default: [AsyncFunction (anonymous)] }
todo.updateTodo(3) //TypeError: todo.updateTodo is not a function
脚本 2.1:
import todo from './File1.js';
await todo.init();
console.log(todo.getTodo())
await todo.updateTodo(2)
console.log(todo.getTodo())
动态导入不同于常规导入。当你这样做时:
import module from "./module.js";
module
将等于默认导出,类似于:
// module.js
export default function module() {
// do something
}
但是,在动态导入 (import()
) 中,您必须手动访问默认导出:
const importModule = await import("./module.js");
const module = importModule.default;
module(); // default export module
所以在你的代码中你会这样做:
todo.default.updateTodo(3);
问题: 在 class 中使用异步调用实现单例设计模式。将模块导入第二个文件时无法获取值。
案例: 最终我想在它过期时为不记名令牌更新实现这个逻辑。我有多个依赖令牌的功能。因此,当我收到 403 时,我将更新令牌,所有其他功能也可以访问此更新的令牌。
脚本 1:
//File1.js
import axios from "axios";
async function getJson(n) {
const req = await axios.get(
`https://jsonplaceholder.typicode.com/todos/${n}`
);
return req.data.title;
}
class Todo {
constructor() {
if (Todo.instance == null) {
this.title;
Todo.instance = this;
}
return Todo.instance;
}
async init() {
this.title = await getJson(1);
}
async updateTodo(n) {
this.title = await getJson(n);
}
getTodo() {
return this.title;
}
}
const todo = await new Todo().init();
export default todo;
脚本 2:
const todo = await import('./File1.js');
console.log(todo); //[Module: null prototype] { default: [AsyncFunction (anonymous)] }
todo.updateTodo(3) //TypeError: todo.updateTodo is not a function
脚本 2.1:
import todo from './File1.js';
await todo.init();
console.log(todo.getTodo())
await todo.updateTodo(2)
console.log(todo.getTodo())
动态导入不同于常规导入。当你这样做时:
import module from "./module.js";
module
将等于默认导出,类似于:
// module.js
export default function module() {
// do something
}
但是,在动态导入 (import()
) 中,您必须手动访问默认导出:
const importModule = await import("./module.js");
const module = importModule.default;
module(); // default export module
所以在你的代码中你会这样做:
todo.default.updateTodo(3);