【发布时间】:2018-10-08 23:19:13
【问题描述】:
我想使用 async 和 await 与 props。
所以基本上我有一个 onRefresh 函数,当用户向下滚动时它会刷新。
在这里,一旦我的 reducer 成功更新数据,我想将状态更改为 false
onRefresh = () => {
this.setState({isFetching: true}, () => {
refreshData = async () => {
await this.props.indianCurrency()
await this.props.exchangeToDisplay(this.coinURL, true)
await this.setState({isFetching: false})
}
})
}
在 await this.props.indianCurrency() 操作中,我添加了一个 console.log 语句来查看它是否正在执行。
这是我对 indianCurrency 的操作
export const indianCurrency = () => {
console.log("inside Indian currency")
return function (dispatch) {
dispatch({type: CURRENCY_FETCHING})
axios.get(CurrencyRateLinkINR).then((response) => {
return (
dispatch({
type: CURRENCY_INR,
payload: response.data
})
)
}).catch((error) => {
return (
dispatch({
type: CURRENCY_ERROR,
payload: error.data
})
)
})
}
}
对于 exchangeToDisplay,我的操作看起来像这样
export const exchangeToDisplay = (exchangURL, random) => {
console.log(random)
console.log("on Refresh check as well")
return function (dispatch) {
if (random == undefined) {
dispatch({type: EXCHANGE_CURRENCY_FETCHING })
}
let koinexApi = axios.get(koinex)
let coinDeltaApi = axios.get(coinDelta)
let multipleExchangeDataApi = axios.get(multipleExchangeData + exchangURL + "-usd")
Promise.all([koinexApi, coinDeltaApi , multipleExchangeDataApi]).then(function(values) {
return(
dispatch({
type: EXCHANGE_CURRENCY_FETCH_SUCCESS,
payload: values
})
)
}).catch((error) => {
return (
dispatch({
type: EXCHANGE_CURRENCY_FETCH_ERROR,
payload: error
})
)
})
}
}
令我惊讶的是,没有什么是不登出的。所以我有理由相信我在这里没有正确使用 async/await?那么有人可以指导我如何正确使用 async 和 await 吗?
注意:我故意不粘贴 reducer code,因为我相信问题恰好出在我的 async/await 中,因为如果需要,它甚至没有运行 export const indianCurrency = () => {那么请告诉我,我会粘贴的。
【问题讨论】:
-
你需要等待 axios.get,因为该代码也是一个承诺
-
@Gonzalo.- 你能在回答部分解释一下吗?
-
@KuchBhi 他说
axios请求是异步的,因此您也需要await它。你正在混合.then和async/await。坚持一种模式。要么将你的async/await包装成简单的try/catch块,要么用.then(...).then(...).then(...)链接你的承诺。阅读本文了解更多信息:pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html
标签: reactjs react-native