我的班级结构如下。
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class EmployeeService {
fulfill(request){
EmployeeRequestExecutor.delegateEmployeeRequest(request);
}
}
module.exports = {EmployeeService};
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};
const {EmployeeRequestExecutor} = require('./EmployeeRequestExecutor');
class HelpfulEmployee {
work(request){
EmployeeRequestExecutor.executeEmployeeRequest(request);
}
}
module.exports = {HelpfulEmployee};
如果我们这样做
let employeeService = new EmployeeService();
employeeService.fulfill(request);
我们得到 TypeError:无法读取“ HelperEmployee.js:5:33”中未定义的属性“ executeEmployeeRequest”
为什么在EmployeeRequestExecutor
内部使用这样的调用结构HelpfulEmployee.js
是不确定的?
答案 0 :(得分:3)
HelpableEmployee和EmployeeRequestExecutor之间存在循环依赖关系(它们两者都相互依赖)。 大多数情况下,循环依赖是由类设计问题引起的。要修复它们,您应该重新考虑对象之间的信息流。
这是一个选项,但还有更多选择:
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};
答案 1 :(得分:0)
在不深入了解此体系结构的最终目的的情况下,删除已经提到的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 };