【问题标题】:Using state in to methods but state isn't updated right away在方法中使用状态,但状态不会立即更新
【发布时间】:2019-08-07 18:23:06
【问题描述】:

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

【问题讨论】:

  • 当状态更新时,你的组件也会更新。您可以检查 componentDidMount 内部的此类更改,以便当您的 accessToken 设置为状态时,您的组件 以正确的生命周期方法对此做出反应。或者(坏主意,但为了学习),setState 有一个回调参数
  • 您能否附上文件的完整代码,而不仅仅是其中的一部分?

标签: javascript reactjs ecmascript-2016


【解决方案1】:

所以这些都是异步调用,这意味着它们不会以可预测的顺序被触发。要完成这项工作,您必须将事情掌握在手中并强制执行顺序。为了进行此更改,您的 goPost 函数应转换为异步调用。然后,它应该等待后续调用以强制暂停以获取令牌。

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

所以现在 this.postComment 在您收到令牌之前不会被执行。另请注意,除非您计划在该函数中执行异步操作,否则无需异步发布评论。

异步编程是一个棘手的课题!可以的话很好 阅读有关这些概念的更多信息,以便您在 这些东西的工作方式!观看this 了解更多信息,这对我帮助很大!

【讨论】:

  • 以这种方式,promise 被强制以可预测的方式工作,但 setState 本身是一个异步调用,它被放置在 getRefreshToken 内,当 @987654325 时可能/可能不会更新状态@ 叫做。所以我建议将setState 带出函数或将postComment 作为回调传递给setState(作为第二个参数)。
  • 我更改了代码以返回令牌并等待它。然后我将令牌传递给 postComment()。将 postComment() 作为回调传递给 setstate 也可以。我考虑过将一些代码移动到 componentDidUpdate() 但仅仅因为令牌发生了变化,我不一定想触发一个帖子。谢谢大家
【解决方案2】:

您可以在 postComment- 中执行此操作-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2018-08-05
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多