У меня есть два файла 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);
Его лучше определить 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
; Таким образом, обновленное значение не изменяется, когда вы его извлекаете после обновления.
return myVar=200;
<- это странно.
Надеюсь это поможет:
// 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.
Оба подхода дадут вам точный результат.
updateMyVar
чтобы обновить значениеmodule.exports
экспортирует значение, а не привязку переменной .module.exports.myvar = myvar;
это выражение присваивает значение точно так, как оно было в момент оценки.