在方法中使用状态但状态不会立即更新

Using state in to methods but state isn't updated right away

我有一个函数调用以获取新的访问令牌 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;
}

所以这些都是异步调用,这意味着它们不会以可预测的顺序被触发。为了使这项工作有效,您必须着手解决问题并强制执行顺序。为了进行此更改,您的 goPost 函数应转换为异步调用。然后,它应该等待后续调用以强制暂停以获取令牌。

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

所以现在 this.postComment 在您收到令牌之前不会执行。另外请注意,没有必要使 post 注释异步,除非您打算在该函数内执行异步操作。

Asynchronous programming is a tricky subject! It is good if you can read more on these concepts so that you have a solid footing on the way these things work! Watch this to learn more, it helped me a lot!

您可以在 postComment-

中执行此操作
  1. 检查状态是否有access_token,如果有,跳转到3,如果没有,
  2. postComment方法里面调用getNewAccessToken
  3. 提取access_token
  4. 调用 post 使用 access_token
  5. 发表评论
  6. 成功完成后,
  7. 在状态中保存令牌并
  8. 下次,如果您对 post 的调用由于 access_token 过期而失败,请再次调用 getNewAccessToken(在第 2 点之后)并按照循环进行。