Дождитесь получения в другом классе - PullRequest
0 голосов
/ 06 мая 2020

У меня есть два класса:

MazeGenerator. js

constructor(gridsize) {
    this.fetchLevels(gridsize);
}

fetchLevels(gridsize){
    fetch("./data/hardcodedLevels.json")
        .then(data => data.json())
        .then(data => {
                return data[gridsize-1];
            }
        ).then(grid => this.maakVeld(grid))
}

maakVeld(grid) {
    for (let i = 0; i < grid[0].length; i++) {
        this.maze[i] = [];
        for (let j = 0; j < grid[0].length; j++) {
            let wall = (grid[i][j] === 1);
            this.maze[i][j] = new Blok(j, i, wall);
        }
    }
}

returnMaze(){
    return this.maze;
}

Который должен возвращать двумерный массив из локального файла json. Grid. js должен сохранить этот массив и использовать его для дальнейших вычислений.

Grid. js

constructor(level) {
    this.generator = new MazeGenerator(level);
    this.veld = this.generator.returnMaze();
    this.grootte = this.veld.length;
}

Как сейчас, this.veld = this.generator.returnMaze(); выполняется до завершения выборки и выдает ошибку, потому что this.veld не определено. Есть ли способ дождаться завершения выборки в другом классе?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы можете вернуть обещание в конструкторе и ждать в другом файле. Пример:

class Test  {
  constructor() {
    return Promise.resolve([1])
  }
}
const x = new Test()
x.then(console.log)

Для вашего случая:

constructor(level) {
    this.generator = new MazeGenerator(level);
    this.generator.then( maze => {
      console.log(maze)
    })
  }

Правильный способ, Подрядчик должен добавить всю конфигурацию. Вы должны вернуть обещание при вызове метода после инициализации.

class MazeRunner {
  constructor(gridsize) {
    this.gridsize = gridsize;
  }
  fetchLevels() {
    return fetch("./data/hardcodedLevels.json")
      .then((data) => data.json())
      .then((data) => data[this.gridsize - 1])
      .then(this.maakVeld);
  }
  maakVeld(grid) {
    let maze = [];
    for (let i = 0; i < grid[0].length; i++) {
      maze[i][j] = [];
      for (let j = 0; j < grid[0].length; j++) {
        let wall = grid[i][j] === 1;
        maze[i][j] = new Blok(j, i, wall);
      }
    }
    return maze;
  }
}
class Test {
  constructor(level) {
    this.generator = new MazeGenerator(level);
    this.generator.fetchLevels().then((maze) => {
      console.log(maze);
    });
  }
}
0 голосов
/ 06 мая 2020

Добавить событие в класс, используя EventEmitter

Ваш код будет выглядеть так:

this.generator = new MazeGenerator(level);
this.generator.on('ready', () => {
  this.veld = this.generator.returnMaze();
  this.grootte = this.veld.length;
});

Или второй вариант: переместить запрос из конструктора в другой метод, чтобы вы может вернуть из него обещание:

this.generator = new MazeGenerator(level);
this.generator.prepare().then(() => {
  this.veld = this.generator.returnMaze();
  this.grootte = this.veld.length;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...