nodejs ts管理共享变量

时间:2019-01-09 09:56:16

标签: node.js typescript singleton

我有一个单例模块

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)
我该怎么做?

1 个答案:

答案 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