Node.js v.11.6.0: как разрешить циклическую зависимость?

Опасайтесь, если вы используете parseInt для преобразования float в научную нотацию! Например:

parseInt("5.6e-14") 

приведет к

5 

вместо

0
1
задан Przemysław Czumaj 15 January 2019 в 23:24
поделиться

1 ответ

Я знаю, что могу решить эту проблему, переместив общие валидаторы в отдельный файл и импортировав его в оба модуля, но это не то, что я ищу.

Это точно , что вам нужно. Сделай это. В этом нет ничего плохого. В вашем текущем демонстрационном коде два объекта _validators даже выглядят одинаково, все их свойства одинаковы - вам даже не нужно создавать два отдельных пользовательских объекта с конкретными свойствами, дополнительными к общим.

Плюс - это просто не кажется правильным: валидаторы свойств ClassA должны придерживаться «домена» ClassA и наоборот.

Что не кажется правильным, так это то, что ClassA выставляет ClassB.VALIDATORS.property_b и наоборот. Почему вы это делаете? Являются ли эти два класса более тесно связаны, чем они должны быть? Похоже, они оба имеют одинаковые имена свойств.

Кроме того, если property_b будет содержать экземпляр Class_B, который должен быть проверен, и вы хотите объявить код проверки с помощью Class_B, то просто дайте Class_B метод .validate() и вызовите его из свойства валидатор, который вы определили в файле Class_A.

Я пытался переместить exports до require, объявив мои структуры как var, чтобы использовать подъем, и многое, многое другое.

Что ж, если вы посмотрите на два литерала объекта

const a_validators = {
    property_a: (value) => true,
    property_b: b_validators.property_b,
};
const b_validators = {
    property_b: (value) => true,
    property_a: a_validators.property_a,
};

, то абсолютно не существует способа упорядочить их порядок оценки так, чтобы оба имели желаемый результат. Вы должны разделить их.

Другое решение - объявить их полупустыми и лениво инициализировать остальные, когда оба модуля были загружены. Вы можете сделать это с помощью геттеров - и при перезаписи module.exports вместо создания свойств для него вам также необходимо поместить вызов require() внутри геттера.

const _validators = {
    property_a: (value) => true,

    get property_b() {
        const { ClassB } = require('./ClassB');
        return ClassB.VALIDATORS.property_b;
    }
};
// and vice versa
0
ответ дан Bergi 15 January 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: