【问题标题】:nodejs ts manage shared variablenodejs ts 管理共享变量
【发布时间】:2019-01-09 09:56:15
【问题描述】:

我有一个单例模块

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

【问题讨论】:

  • 输出是“aaa”,但我需要输出之前设置的值(bbb) - 没有证据表明它是之前设置的。这个问题没有显示这些模块是如何相关的。请提供stackoverflow.com/help/mcve

标签: node.js typescript singleton


【解决方案1】:

单例类通常被认为是反模式,它们在模块化环境中肯定是反模式。模块在 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 import shadows global global。

【讨论】:

  • 我之前无法导入 part1,竞态条件必须和我的例子一模一样
  • 为什么?您没有显示在您的示例中如何使用 part1 。它不是在 main 中导入的。
  • 应该有动态import()而不是静态import的真正原因吗?
  • 是的,因为模块是通过文件夹扫描加载的
  • 此时问题不包含除了单例类之外可以复制的问题。没有比赛条件。它应该工作。 stackblitz.com/edit/typescript-covzy1
猜你喜欢
  • 2019-12-11
  • 2017-05-23
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多