Использование состояния в методах, но состояние не обновляется сразу - PullRequest
0 голосов
/ 17 марта 2019

У меня есть функция, которая делает вызов для получения нового токена доступа getNewAccessToken () и в методе устанавливает токен в состояние. Затем вызывается другой метод postComment (), но он еще не имеет правильного accessToken в состоянии (так как setstate был асинхронным вызовом и, вероятно, еще не имеет значения. Каков наилучший способ исправить это для обеспечения postComment ( ) имеет правильное значение состояния?

  goPost() {
    console.log("In goPost()");
    this.getNewAccessToken();
    this.postComment();
  }
async getNewAccessToken(){
      const response = await fetch(
        `https://www.reddit.com/api/v1/access_token`... set up fetch
      );
      if (response.ok) {
         this.setState({
            accessToken: json.access_token
         });
      }
}
async postComment() {
    let accessToken = this.state.accessToken;
}

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вы можете сделать это вместо этого внутри postComment -

  1. проверить, имеет ли состояние access_token, если да, перейти к 3, если нет,
  2. вызвать getNewAccessToken внутри метода postComment,
  3. извлекает вызов access_token,
  4. для публикации комментария, используя access_token,
  5. , если успешно выполнено,
  6. сохраните токен в состоянии и
  7. , когда в следующий раз произойдет сбой вашего звонка для публикации комментария из-за истечения access_token, снова наберите getNewAccessToken (после пункта 2) и выполните цикл.
0 голосов
/ 17 марта 2019

Так что это все асинхронные вызовы, то есть они не запускаются в предсказуемом порядке. Чтобы заставить это работать, вы должны взять дело в свои руки и навязать порядок исполнения. Чтобы сделать это изменение, ваша функция goPost должна быть преобразована в асинхронный вызов. Затем следует дождаться последующих вызовов, чтобы заставить паузу получить токен.

  async goPost() {
    console.log("In goPost()");
    await this.getRefreshToken();
    this.postComment();
  }

Так что теперь this.postComment не будет выполняться, пока вы не получите свой токен. Кроме того, дополнительное примечание: нет необходимости делать пост-комментарий асинхронным, если только вы не планируете делать операции в этой функции.

Асинхронное программирование - сложная тема! Это хорошо, если вы можете Узнайте больше об этих концепциях, чтобы у вас была как эти вещи работают! Смотреть это , чтобы узнать больше, мне очень помогло!

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