在方法中使用状态但状态不会立即更新
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
-
中执行此操作
- 检查状态是否有
access_token
,如果有,跳转到3,如果没有,
- 在
postComment
方法里面调用getNewAccessToken
,
- 提取
access_token
、
- 调用 post 使用
access_token
、 发表评论
- 成功完成后,
- 在状态中保存令牌并
- 下次,如果您对 post 的调用由于
access_token
过期而失败,请再次调用 getNewAccessToken
(在第 2 点之后)并按照循环进行。
我有一个函数调用以获取新的访问令牌 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
-
- 检查状态是否有
access_token
,如果有,跳转到3,如果没有, - 在
postComment
方法里面调用getNewAccessToken
, - 提取
access_token
、 - 调用 post 使用
access_token
、 发表评论
- 成功完成后,
- 在状态中保存令牌并
- 下次,如果您对 post 的调用由于
access_token
过期而失败,请再次调用getNewAccessToken
(在第 2 点之后)并按照循环进行。