Почему этот асин c вызов в componentDidMount влияет на время, необходимое компоненту для монтирования? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть экран главного меню и кнопка, которая ведет к экрану игры (используя react-navigation). Нажатие на эту кнопку должно сразу перейти к экрану игры. На настройку игры требуется немного времени, поэтому я хочу показать значок загрузки, пока игра не будет готова. В моем классе GameComponent у меня есть следующее для конструктора, а componentDidMount:

constructor(props) {
    super(props);

    this.tileRowRef = React.createRef<LetterTileRow>();
    this.inputRef = React.createRef<Input>();

    this.currentTypedWord = '';

    this.state = {
        errorMessage: '',
        gameLoading: true,
    }

    this.game = null;
}

componentDidMount(): void {
    this.game = WordGame.getSingleplayerGameInstance();
    this.game.setUpGame().then(() => this.gameFinishedLoading());
}

setUpGame - это функция экземпляра asyn c в классе WordGame, которая обрабатывает все игры logi c:

async setUpGame() {
    this.currentGameState.currentWord = await WordGame.generateStartWord();
    this.gameIsReady = true;
}

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

Странно длинная пауза после нажатия кнопки, чтобы перейти к игре. К тому времени, когда приложение перейдет на экран игры, игра уже загружена. Чтобы убедиться, что игра на самом деле не дожидается окончания загрузки sh, я добавил искусственное ожидание в 2 секунды к функции setUpGame, и в этом случае я смог увидеть значок загрузки.

Но я действительно не понимаю, откуда взялась эта пауза. Я взял экранные записи поведения с и без строки this.game.setUpGame().then(() => this.gameFinishedLoading()); в componentDidMount. Я наложил их на нажатие кнопки в одно и то же время, и разница очень очевидна: https://drive.google.com/open?id=1IX_GyXENvmCJzvG0_TIU4deS8t6UGpjO

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