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

时间:2019-03-17 03:05:23

标签: javascript reactjs ecmascript-7

我有一个函数,该函数进行调用以获取新的访问令牌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 :(得分:0)

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

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

因此,直到您收到令牌后,this.postComment才会执行。另外请注意,除非您打算在该函数中执行异步操作,否则无需使评论异步。

  

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

答案 1 :(得分:0)

您可以在postComment-

中执行此操作
  1. 检查状态是否为access_token,如果是,则跳转到3,如果不是,
  2. getNewAccessToken方法内调用postComment
  3. 提取access_token
  4. 致电以使用access_token发表评论
  5. 成功完成后,
  6. 将令牌保存为状态,并且
  7. 下一次,如果由于access_token过期而导致您的发表评论的呼叫失败,请再次呼叫getNewAccessToken(在第2点之后)并遵循循环。