需要解决未定义

时间:2019-12-20 13:29:50

标签: javascript node.js ecmascript-6 require

我的班级结构如下。

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);

我们得到 TypeError:无法读取“ HelperEmployee.js:5:33”中未定义的属性“ executeEmployeeRequest”

为什么在EmployeeRequestExecutor内部使用这样的调用结构HelpfulEmployee.js是不确定的?

2 个答案:

答案 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 };