要求解决未定义

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