我正在尝试将redux-thunk连接到Next.js,如果我的thunk返回一个promise,它就可以正常工作。如何将其转换为使用异步/等待?我看了一下这篇文章(how to async/await redux-thunk actions?),但是我却难以解决。
我的index.js中的getInitialProps
是
static getInitialProps(props) {
const {store, isServer} = props.ctx;
if (!store.getState().placeholderData) {
return store.dispatch(loadData());
}
目前,我处理数据加载的操作是
export const loadData = () => (dispatch) => {
return isoFetch(homeES_endpoint)
.then(res => res.json())
.then(data => dispatch(loadDataSuccess(data)))
.catch(err => console.error('error loading data', err.toString()));
}
如何将loadData转换为使用异步/等待?我已经尝试过
export const loadData = () => async (dispatch) => {
try {
const res = await isoFetch(homeES_endpoint);
const data = await res.json();
dispatch(loadDataSuccess(data));
} catch(error) {
//dispatch({ type: LOGIN_ERROR, error });
console.error('error loading data',error.toString())
}
}
但是'_app.js'中的主要getInitialProps
不会等待。
答案 0 :(得分:2)
它不特定于redux-thunk。 async..await
是诺言的句法糖。一旦知道了它的确切工作原理,便可以将其应用于任何情况。 await
替代.then(...)
。 try..catch
替代catch(...)
:
export const loadData = () => async (dispatch) => {
try {
const res = await isoFetch(homeES_endpoint);
const data = await res.json();
const result = await dispatch(loadDataSuccess(data));
return result;
} catch (err) {
console.error('error loading data', err.toString()));
}
}
区别在于dispatch(...)
是从then
返回的,因此需要进行await
正确的翻译。 async..await
的一个已知陷阱是,如果用return dispatch(...
返回了一个诺言,则不会用try..catch
处理它。