【发布时间】:2020-01-30 15:29:23
【问题描述】:
我的目的是减少用户在转换到需要来自 API 数据的屏幕时的等待时间。
目前是这样的,fetchSomeData 返回一个承诺:
// Screen 1
this.navigateToScreenTwo()
// Screen 2
async componentDidMount(){
try {
const data = await fetchSomeData()
this.setState({ data })
} catch(e){}
}
我想要做的是启动承诺,在导航状态下将其传递到下一个屏幕,然后在下一个屏幕中等待它的结果。由于屏幕转换需要 300 毫秒,这足以从 API 获取结果,从而使转换和数据加载无缝。
做这样的事情是个好习惯吗?如果没有,最好的方法是什么?
// Screen 1
const dataPromise = fetchSomeData() // purposely without await
this.navigateToScreenTwo({ dataPromise }) // pass promise in navigation
// Screen 2
async componentDidMount(){
try {
const data = await this.navigation.dataPromise // the promise from navigation state
this.setState({ data })
} catch(e){}
}
次要的:是否应该在第一次返回 promise 的屏幕 1 中有一个 try/catch?
【问题讨论】:
-
“屏幕”是不同的页面吗?也就是说,当你从“屏幕1”移动到“屏幕2”时,全局环境是否被拆除并重新创建?
-
“在屏幕 1 中是否应该有一个 try/catch 在第一次返回承诺” 每个问题问 一个 问题,而不是两个问题。解决第二个问题:Promise 的基本规则之一是:要么处理错误,要么将 Promise 传递给其他东西(处理错误,或将 Promise 传递给...)。
-
@T.J.Crowder 是的,我主要是在移动环境中发言,但这同样适用于网络。因此,例如,在 web 中,这将是一个 react-router 转换。
-
有什么原因不能lift the state up 组件树并在父级中处理异步调用?
-
@krisaoe 例如,在 react-router 中,我正在路由器内部的 Switch 组件内的屏幕之间切换,目前没有任何状态保持在该级别,因为它或多或少是应用程序的最高级别语境。在一个有 100 多个页面的应用程序中,必须有一个非常通用的解决方案,比如 redux 等。
标签: javascript reactjs promise