nodejs TS управлять общей переменной - PullRequest
0 голосов
/ 09 января 2019

У меня есть одноэлементный модуль

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 голосов
/ 09 января 2019

Синглтон-классы часто можно считать антипаттернами, они, безусловно, являются антипаттернами в модульной среде. Модули, естественно, предоставляют синглтоны в Node.js, потому что они оцениваются только один раз при нормальных обстоятельствах.

Проблема с исходным кодом заключается в том, что global.foo = "bbb" в main.js оценивается после console.log(global.foo) в part1.js, поэтому существует условие гонки.

Это может быть:

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 global.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...