Общая переменная в файлах Javascript возвращает устаревшее значение

1

У меня есть два файла javascript. Я хочу создать общую переменную, которая будет создана в файле 1, но может быть использована во втором файле. Общая переменная инициализируется с определенным значением, но затем обновляется каким-либо другим значением в файле 1. Поскольку файл 2 вызывается после обновления переменной в файле 1, я ожидаю, что она будет иметь последнее значение, но она всегда дает мне устаревшую значение. Это то, что я пробовал.

файл 1

var myVar ='100';

//assume updateMyVar function exists which will return a callback with the value that needs to be updated

updateMyVar('someKey', function(result)
{
//let assume the result came back as someValue
    console.log("inside callback " + result);
    myVar = result;

});

module.exports.myvar = myvar;

файл 2

var file1 =require('./file1');
var myvar = file1.myvar;

//expecting myvar to be someValue instead of 100
console.log(myvar);
  • 0
    где вы вызываете updateMyVar чтобы обновить значение
  • 1
    module.exports экспортирует значение, а не привязку переменной . module.exports.myvar = myvar; это выражение присваивает значение точно так, как оно было в момент оценки.
Теги:

2 ответа

3

Его лучше определить getter для него.

В файле file1.js

const getMyVar = ()=>{
    return myVar;
}

module.exports.getMyVar = getMyVar;

file2.js

var {getMyVar} =require('./file1');
console.log(getMyVar());

На данный момент,

module.exports.myvar = myvar;

этот оператор обеспечивает одноразовую привязку с текущим значением myvar; Таким образом, обновленное значение не изменяется, когда вы его извлекаете после обновления.

  • 0
    return myVar=200; <- это странно.
  • 0
    @zerkms мой плохой. Я вставил тестовый код
0

Надеюсь это поможет:

// Use some kind of Module pattern to achieve this in a proper manner.
const X_MODULE = (() => { // Anonymous function
    this.myVar = 100;

    updateMyVar('someKey', (result) => {
        //let assume the result came back as someValue
        console.log("inside callback " + result);
        this.myVar = result;
    });
    return this;
})(); // IIFE -> Immediately Invoked Function Expression.

module.exports = X_MODULE;

// OR make use of one of the OOPs Singleton Class Pattern
class X_MODULE {

    constructor() {
        this._myVar = 100;

        // I've kept this call just for demonstration purpose.
        updateMyVar('someKey', (result) => {
            //let assume the result came back as someValue
            console.log("inside callback " + result);
            this._myVar = result;
        });
    }

    get myVar() {
        return this._myVar;
    }
}
module.exports = new X_MODULE(); // Singleton Pattern: will have only one instance throughout the app lifecycle.

Оба подхода дадут вам точный результат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню