我有一个单例模块
class Singleton {
private static instance: Singleton;
private _foo!: string;
private constructor() {
}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
Singleton.instance._foo = "aaa";
}
return Singleton.instance;
}
get foo(): string {
return this._foo;
}
set foo(txt) {
this._foo = txt;
}
}
export let global = Singleton.getInstance();
在主文件中,我这样做
// main.ts
import { global } from "./global";
global.foo = "bbb";
console.log(global.foo);
import("./part1").then((t) => {
t.default();
});
这将输出“ bbb”。现在主模块导入另一个文件(part1.ts)
在part1.ts中,我再次导入了全局模块
// part1.ts
import { global } from "./global";
export default () => {
console.log("test:" + global.foo);
};
输出为“ aaa”,但我需要输出以前的设置值(bbb)
我该怎么做?
答案 0 :(得分:1)
Singleton类通常可以被视为反模式,它们在模块化环境中无疑是反模式。模块自然会在Node.js中提供单例,因为它们在正常情况下只会被评估一次。
原始代码的问题是main.js中的global.foo = "bbb"
在part1.js中的console.log(global.foo)
之后求值,所以存在竞争条件。
可能是:
global.js
export default { foo: 'a' };
part1.js
import _global from "./global"; // _global.foo === 'a'
import "./part2"; // _global.foo === 'b'
console.log(_global.foo);
part2.js
import _global from "./global";
_global.foo = "b";
原始代码中的另一个潜在问题是global
全局导入阴影global
。