Проблема синхронизации Phaser.js Axios при смене сцен

Есть ли способ сделать вызов axios get внутри моего кода Phaser 3, а затем загрузить новую сцену с данными ответа? В настоящий момент у меня возникла своего рода проблема со временем: я думаю, что вторая сцена загружается до того, как вызов axios сможет вернуть ответ? Любая помощь будет принята с благодарностью. Вот мой код. Во-первых, внутри моего js-файла SelectDifficultyScene:

preload()
{
    this.fetchSudoku();
    
    // this.scene.start(GameScene, this.sudoku);
}

async fetchSudoku()
{
    self = this;
    
    console.info("Select Difficulty Scene");

    try
    {
        const response = await axios.get('api/fetch-sudoku');
        console.info("Select Difficulty Scene", self.sudoku);
        self.setSudoku(response.data);
        self.loadGameScene();
        // const gameScene = new GameScene();
    } catch(error) {
        console.info(error);
    }
}

setSudoku(sudoku)
{
    this.sudoku.unsolvedSudoku = sudoku.unsolvedSudoku;
    this.sudoku.solvedSudoku = sudoku.solvedSudoku;
    this.sudoku.difficultyLevel = "Easy";
}

loadGameScene()
{
    this.scene.start('GameScene', this.sudoku);
}

Затем внутри моего файла GameScene:

init(sudoku)
{
    // console.info(sudoku);
    this.setSudokuNumbers(sudoku);
}

setSudokuNumbers(sudoku)
{
    let unsolvedCount = 0;
    let solvedCount = 0;
    for(let x = 0; x < 9; x++)
    {
        for(let y = 0; y < 9; y++)
        {
            this.sudokuGridUnsolved[x][y] = sudoku.unsolvedSudoku[unsolvedCount];
            this.sudokuGridSolved[x][y] = sudoku.solvedSudoku[solvedCount];
            unsolvedCount++;
            solvedCount++;
        }
    }
    
    // console.info(sudoku, this.sudokuGrid);
}

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

Можете ли вы поделиться соответствующим кодом, который создает проблему (или MRE)? Поскольку ваш вопрос имеет много дополнительных вопросов. Например: где в коде должен происходить вызов? должен ли код приостановить текущую сцену до тех пор, пока не выполнится обратный вызов, или нет? какие данные ответа имеют отношение к вызову следующей сцены? как следует начать следующую сцену? ...?

winner_joiner 01.05.2024 20:33

...Я почти забыл, как вы замечаете/определяете эту «проблему времени»?

winner_joiner 02.05.2024 09:38

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

summer9844 03.05.2024 10:25

Можете ли вы поделиться соответствующим кодом/примером? не понятно когда и где вы загружаете Сцену или когда используете? аксиомы.

winner_joiner 03.05.2024 10:30

Я обновил свой ответ рабочим примером, надеюсь, это поможет.

winner_joiner 04.05.2024 07:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Звучит так просто:

class Scene extends Phaser.Scene {
  ...
  async create() {
    ...
    const data = await axios.get('your-endpoint-url')
    this.scene.launch('your-next-scene-key', { data })
  }
}

Если вам нужно выключить текущую сцену, вам следует использовать метод .start вместо .launch.

Ответ принят как подходящий

Я думаю, проблема в том, в каком порядке вы загружаете сцены в config, но, не видя этого, я просто предполагаю.
Порядок в массиве имеет значение, в первом фрагменте кода GameScene загружается и отображается первым. SelectDifficultyScene загружается, но не запускается/не отображается.

const config = {
    type: Phaser.AUTO,
    ...
    scene: [ GameScene, SelectDifficultyScene ]
};

Переключение порядка сцен должно решить вашу проблему, если я правильно понял, что вы настроили.

const config = {
    type: Phaser.AUTO,
    ...
    scene: [ SelectDifficultyScene, GameScene ]
};

Обновление
(небольшая рабочая демо)

document.body.style = 'margin:0;';

class FirstScene extends Phaser.Scene {
    constructor(){
        super('FirstScene');
    }
    
    create(){
        let label = this.add.text(10,10, 'FirstScene\n... please wait')
            .setScale(1.5)
            .setOrigin(0)
            .setStyle({fontStyle: 'bold', fontFamily: 'Arial'});
        
        setTimeout( _ =>
          axios.get('https://jsonplaceholder.typicode.com/posts/1')
            .then((response) => {
              this.scene.start('SecondScene', response.data);
            })
            .catch(function (error) {
              label.setText(` First Scene\nError: ${error}`);
            }), 
        2000);
    }
}

class SecondScene extends Phaser.Scene {
    constructor(){
        super('SecondScene');
        console.info(this);
    }
    
    create(data){
    
        let label = this.add.text(10,10, 'SecondScene')
            .setScale(1.5)
            .setOrigin(0)
            .setStyle({fontStyle: 'bold', fontFamily: 'Arial'});
            
        let dataLabel = this.add.text(10, 40, JSON.stringify(data))
            .setOrigin(0)
            .setWordWrapWidth(300)
            .setStyle({fontStyle: 'bold', fontFamily: 'Arial'});   
    }
}

var config = {
    type: Phaser.AUTO,
    width: 536,
    height: 183,
    scene: [FirstScene, SecondScene],
}; 

new Phaser.Game(config);
<script src = "//cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
<script src = "//cdn.jsdelivr.net/npm/phaser/dist/phaser.min.js"></script>

Другие вопросы по теме