NodeJS:早期要求无法访问对象字段
NodeJS: Early require doesn't have access to object field
我在访问位于文件顶部 required/imported 的对象中的字段时遇到问题,但是当稍后在代码中再次导入该对象时,该字段是可访问的。
我举了一个小例子来说明我的意思:[Execute code on CodingGround]
main.js:
var ClassA = require('./ClassA');
ClassA.init();
ClassA.js:
var ClassB = require('./ClassB');
var ClassA = function() {};
ClassA.init = function() {
// Define a variable in ClassA
this.myVar = 'My Value';
// Create an instance of ClassB, and try to print the defined variable
var myClass = new ClassB();
myClass.printMyVar();
};
module.exports = ClassA;
ClassB.js:
var ClassA = require('./ClassA');
var ClassB = function() {};
ClassB.prototype.printMyVar = function() {
// Print the variable (not working)
console.log('My Var: ' + ClassA.myVar);
// Require ClassA again
ClassA = require('./ClassA');
// Print the variable again (working)
console.log('My Var (again): ' + ClassA.myVar);
};
module.exports = ClassB;
执行 main.js
时得到以下输出:
My Var: undefined
My Var (again): My Value
为什么第一行显示变量未定义,为什么在requiring/importing再次对象后正确显示变量?
这是循环依赖引起的吗?如果是的话,以后如何避免这个问题?
这是描述的情况in the NodeJS modules "cycle" topic。如果存在循环依赖关系,解决方案似乎是增加 exports
对象而不是替换 它。
这是他们的例子,修改后显示当 b
检查 a.done
之后 ,它看到正确的值:
a.js:
console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
b.js:
console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
exports.check = function() {
console.log('in b\'s check function, a.done = %j', a.done);
};
console.log('b done');
main.js:
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
b.check();
输出为:
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done=true, b.done=true
in b's check function, a.done = true
我在访问位于文件顶部 required/imported 的对象中的字段时遇到问题,但是当稍后在代码中再次导入该对象时,该字段是可访问的。
我举了一个小例子来说明我的意思:[Execute code on CodingGround]
main.js:
var ClassA = require('./ClassA');
ClassA.init();
ClassA.js:
var ClassB = require('./ClassB');
var ClassA = function() {};
ClassA.init = function() {
// Define a variable in ClassA
this.myVar = 'My Value';
// Create an instance of ClassB, and try to print the defined variable
var myClass = new ClassB();
myClass.printMyVar();
};
module.exports = ClassA;
ClassB.js:
var ClassA = require('./ClassA');
var ClassB = function() {};
ClassB.prototype.printMyVar = function() {
// Print the variable (not working)
console.log('My Var: ' + ClassA.myVar);
// Require ClassA again
ClassA = require('./ClassA');
// Print the variable again (working)
console.log('My Var (again): ' + ClassA.myVar);
};
module.exports = ClassB;
执行 main.js
时得到以下输出:
My Var: undefined
My Var (again): My Value
为什么第一行显示变量未定义,为什么在requiring/importing再次对象后正确显示变量?
这是循环依赖引起的吗?如果是的话,以后如何避免这个问题?
这是描述的情况in the NodeJS modules "cycle" topic。如果存在循环依赖关系,解决方案似乎是增加 exports
对象而不是替换 它。
这是他们的例子,修改后显示当 b
检查 a.done
之后 ,它看到正确的值:
a.js:
console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');
b.js:
console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
exports.check = function() {
console.log('in b\'s check function, a.done = %j', a.done);
};
console.log('b done');
main.js:
console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);
b.check();
输出为:
main starting a starting b starting in b, a.done = false b done in a, b.done = true a done in main, a.done=true, b.done=true in b's check function, a.done = true