要求解决未定义
Require resolves undefined
我有以下 class 结构。
EmployeeService.js
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class EmployeeService {
fulfill(request){
EmployeeRequestExecutor.delegateEmployeeRequest(request);
}
}
module.exports = {EmployeeService};
EmployeeRequestExecutor.js
const {HelpfulEmployee} = require('./HelpfulEmployee');
class EmployeeRequestExecutor {
static delegateEmployeeRequest(request){
let employee = new HelpfulEmployee();
employee.work(request);
}
static executeEmployeeRequest(request){
console.log('Executed', request);
}
}
module.exports = {EmployeeRequestExecutor};
HelpfulEmployee.js
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class HelpfulEmployee {
work(request){
EmployeeRequestExecutor.executeEmployeeRequest(request);
}
}
module.exports = {HelpfulEmployee};
如果我们再做
let employeeService = new EmployeeService();
employeeService.fulfill(request);
我们得到
类型错误:无法读取 HelpfulEmployee.js:5:33
中未定义的 属性 'executeEmployeeRequest'
为什么这样的调用结构EmployeeRequestExecutor
里面HelpfulEmployee.js
是未定义的?
HelpfulEmployee 和EmployeeRequestExecutor 之间存在循环依赖(它们都需要彼此)。
循环依赖大部分时间是由 class 设计问题引起的。要修复它们,您应该重新考虑对象之间的信息流。
这是一个选项,但还有很多:
const {HelpfulEmployee} = require('./HelpfulEmployee');
class EmployeeRequestExecutor {
static delegateEmployeeRequest(request){
let employee = new HelpfulEmployee();
let requestExecutor = new EmployeeRequestExecutor();
employee.work(request, requestExecutor);
}
executeEmployeeRequest(request){
console.log('Executed', request);
}
}
module.exports = {EmployeeRequestExecutor};
class HelpfulEmployee {
work(request, requestExecutor){
requestExecutor.executeEmployeeRequest(request);
}
}
module.exports = {HelpfulEmployee};
在不深入了解该架构的最终目的的情况下,要删除已经提到的 circular dependency
@Nicolas,一种选择是实例化服务中的员工并将其提供给执行者:
const { EmployeeRequestExecutor } = require("./EmployeeRequestExecutor");
const { HelpfulEmployee } = require("./HelpfulEmployee");
class EmployeeService {
fulfill(request) {
let employee = new HelpfulEmployee();
EmployeeRequestExecutor.delegateEmployeeRequest(employee, request);
}
}
module.exports = { EmployeeService };
我有以下 class 结构。
EmployeeService.js
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class EmployeeService {
fulfill(request){
EmployeeRequestExecutor.delegateEmployeeRequest(request);
}
}
module.exports = {EmployeeService};
EmployeeRequestExecutor.js
const {HelpfulEmployee} = require('./HelpfulEmployee');
class EmployeeRequestExecutor {
static delegateEmployeeRequest(request){
let employee = new HelpfulEmployee();
employee.work(request);
}
static executeEmployeeRequest(request){
console.log('Executed', request);
}
}
module.exports = {EmployeeRequestExecutor};
HelpfulEmployee.js
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class HelpfulEmployee {
work(request){
EmployeeRequestExecutor.executeEmployeeRequest(request);
}
}
module.exports = {HelpfulEmployee};
如果我们再做
let employeeService = new EmployeeService();
employeeService.fulfill(request);
我们得到 类型错误:无法读取 HelpfulEmployee.js:5:33
中未定义的 属性 'executeEmployeeRequest'为什么这样的调用结构EmployeeRequestExecutor
里面HelpfulEmployee.js
是未定义的?
HelpfulEmployee 和EmployeeRequestExecutor 之间存在循环依赖(它们都需要彼此)。 循环依赖大部分时间是由 class 设计问题引起的。要修复它们,您应该重新考虑对象之间的信息流。
这是一个选项,但还有很多:
const {HelpfulEmployee} = require('./HelpfulEmployee');
class EmployeeRequestExecutor {
static delegateEmployeeRequest(request){
let employee = new HelpfulEmployee();
let requestExecutor = new EmployeeRequestExecutor();
employee.work(request, requestExecutor);
}
executeEmployeeRequest(request){
console.log('Executed', request);
}
}
module.exports = {EmployeeRequestExecutor};
class HelpfulEmployee {
work(request, requestExecutor){
requestExecutor.executeEmployeeRequest(request);
}
}
module.exports = {HelpfulEmployee};
在不深入了解该架构的最终目的的情况下,要删除已经提到的 circular dependency
@Nicolas,一种选择是实例化服务中的员工并将其提供给执行者:
const { EmployeeRequestExecutor } = require("./EmployeeRequestExecutor");
const { HelpfulEmployee } = require("./HelpfulEmployee");
class EmployeeService {
fulfill(request) {
let employee = new HelpfulEmployee();
EmployeeRequestExecutor.delegateEmployeeRequest(employee, request);
}
}
module.exports = { EmployeeService };