Проблема с объемом, или передача по ссылке, или что-то еще? - PullRequest
0 голосов
/ 14 мая 2019

Я создаю приложение expressJS и хочу, чтобы было очень легко добавлять конечные точки. Итак, у меня есть класс Endpoint, который обрабатывает множество вещей, в том числе предоставляет базовые функции CRUD для Express Router

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

Установка здесь не использует экспресс, но иллюстрирует ту же проблему.

Я не очень много пробовал, прими сведение проблемы до минимально достаточного кода, необходимого для демонстрации проблемы.

Вы можете увидеть код ниже, или проверить https://repl.it/@SethGreen1/WhoppingJuniorTerabyte

Вот файл index.js, который запускает все:

const Router = require('./router.js');
const Endpoint = require('./endpoint.js');

const AppleEndpoint = new Endpoint("Apple");

const OrangeEndpoint = new Endpoint("Orange");

const AppleRouter = AppleEndpoint.getRouter();

const OrangeRouter = OrangeEndpoint.getRouter();

AppleRouter.executeRoute("get");

OrangeRouter.executeRoute("get");

И, router.js:

class Router {

    constructor() {
      this.routes = [];
    }

    addRoute(name, func){
      this.routes[name] = func;
    }

    executeRoute(name){
      this.routes[name]();
    }
}

module.exports = new Router();

И, наконец, endpoint.js

const Router = require('./router.js');

class Endpoint {

    constructor(name) {
        this.name = name;
    }

    getRouter() {

      Router.addRoute("get", () => {
        console.log(this.name);
      });
      return Router;
    }

    getName() {
      console.log(this.name);
    }
}

module.exports = Endpoint;

Я ожидаю, что этот код напечатает:

Apple
Orange

Вместо этого это печать:

Orange
Orange

1 Ответ

0 голосов
/ 14 мая 2019

Вы создаете экземпляр своего класса Router внутри своего собственного файла, следовательно, создаете singleton .

Singleton гарантирует, что класс имеет только один экземпляр, и обеспечивает глобальную точкудоступ к нему.

Чтобы избежать этого, необходимо создать его экземпляр в конечной точке constructor.См. Ниже

Enpoint.js:

const Router = require('./router.js')

class Endpoint {
  constructor (name) {
    this.name = name
    this.router = new Router()
  }

  getRouter () {
    this.router.addRoute('get', () => {
      console.log(this.name)
    })
    return this.router
  }

  getName () {
    console.log(this.name)
  }
}

module.exports = Endpoint

и Router.js:

class Router {
  constructor () {
    this.routes = []
  }

  addRoute (name, func) {
    this.routes[name] = func
  }

  executeRoute (name) {
    this.routes[name]()
  }
}

module.exports = Router
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...