【发布时间】:2021-08-02 12:02:41
【问题描述】:
我正在使用 redux 来管理我的应用的全局状态。
我有全局状态“shop”并通过“onFilterShops”改变它的值。
const mapStateToProps = ({ shops }) => {
return {
shops: shops.shops
}
}
const mapDispatchToProps = dispatch => {
return {
onFilterShops: shop => dispatch(filterShops(shop))
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MenuShop)
更改此状态会在我的应用中运行一个过滤器并需要几秒钟,因此我想在此过程中显示一个 Spinner。
const toggleMenu = index => {
setIsLoading(true) //Local state, Spinner visible - Line 1
props.onFilterShops(index) // Line 2
setIsLoading(false) //Local state, Spinner invisible - Line 3
}
问题是执行第一行2,过滤器完成,在过滤器结束时,执行第1行和第3行,Spinner没有机会出现。
如果我在中间放一个承诺,它会起作用,但它很丑。
const wait = ms => new Promise(resolve => setTimeout(resolve, ms))
const toggleMenu = async (index) => {
setIsLoading(true)
await wait(1)
props.onFilterShops(index)
setIsLoading(false)
}
为什么?
【问题讨论】:
-
如果 Promise 丑陋,不要使用 javascript。有一些选择:例如 Kotlin/JS 和 React。在这里,您可以使用 Curutines。它们非常简洁且富有表现力。哪个海豚在这里有 1 秒的延迟?
-
嗨@BierDav。丑陋的不是承诺,而是我所做的。我创建了一个承诺,在执行过滤器之前等待 1 毫秒。这是丑陋的,它必须有一个更优雅的方式。
-
有道理
标签: javascript node.js react-native react-redux