У меня возникла проблема с доступом к полю в объекте, который требуется/импортирован в начале файла, однако это поле доступно при импорте объекта в более поздняя точка в коде.NodeJS: Раннее требование не имеет доступа к полю объекта
Я сделал небольшой пример, чтобы показать, что я имею в виду: [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
Почему первая строка покажет переменная не определена, и почему это показать правильно ли после повторного запроса/импорта объекта?
Это связано с круговой зависимостью, и если да, то как я могу избежать этой проблемы в будущем?
Спасибо, что очень полезно. Я предполагаю, что вы подразумеваете, что я должен _add_ функции/поля в 'module.exports' вместо полной замены его, например' ClassA'. Если это так, как бы вы определили конструктор класса? Я задал аналогичный вопрос в этом комментарии: http://stackoverflow.com/questions/10869276/how-to-deal-with-cyclic-dependencies-in-node-js#comment64995389_10872988 –
@ TimVisée: Я думаю, что очень что делает сам NodeJS в некоторых случаях: модуль определяет «пространство имен», если вы захотите (объект «export»), а отдельные классы доступны как свойства этого объекта, а не являются верхним уровнем. Например, например, 'fs.FSWatcher',' fs.Stats' и т. Д.Но они несовместимы: модуль событий заменяет объект 'export' на' EventEmitter'. (Я подозреваю, что модули ES2015 разрешат это, но это может быть принятие желаемого за действительное с моей стороны ...) –
Спасибо. Я думаю, что я должен стараться избегать круговых зависимостей, чтобы сохранить все, кроме modulair_. –