【发布时间】:2018-12-24 12:10:27
【问题描述】:
我有一个函数foo,它可能会或可能不会调用多个异步请求以缓存令牌:
async foo() {
let token = this._token;
if(!token) {
token = await this.getTokenFromStorage();
}
if(Tokens.isExpired(this._token) {
this._token = await Tokens.refresh(this._token);
} else {
this._token = token;
}
return this._token;
}
现在,我希望调用 foo 的 React 组件具有如下逻辑:
- 调用 foo()
- 如果 foo 有缓存令牌,
setState{isLoading: false} - 否则,
setState{ isLoading: true },并等待异步操作完成。异步操作完成后调用setState{ isLoading: false }并返回新缓存的令牌...
不过,对于如何执行此操作非常迷茫……感谢您的帮助。
【问题讨论】:
-
似乎您可以在
foo的开头将isLoading状态设置为true,在结尾设置为false。 -
你为什么关心它是否从缓存中检索?在调用 foo 之前总是将 loading 设置为 true 要容易得多。
-
我觉得这会触发“React”不必要的重新渲染,因为即使令牌被缓存,我也会设置
isLoading: true,然后立即以相同的方法将其设置回false ...似乎很浪费。 -
@Cod3Citrus 好吧,您的替代方案是将函数的内部暴露到更高级别,这会破坏您的透明缓存尝试。当然你可以这样做,但你会将你的功能耦合到表示层。 react 的部分乐趣在于编写被渲染的低效代码。请记住,仅仅因为 react 重新渲染并不意味着您会获得 dom 刷新,这是缓慢的部分。
-
是 foo 在您要更改其状态的组件之外吗?
标签: javascript async-await es6-promise ecmascript-2016