Javascript useReducer返回承诺而不是更新状态
我的减速机:Javascript useReducer返回承诺而不是更新状态,javascript,reactjs,react-hooks,use-reducer,Javascript,Reactjs,React Hooks,Use Reducer,我的减速机: export const initialUserState = { username: '', address: '', token: '', address: '', loggedIn: false, loaded: false, }; export const userReducer = async (state, action) => { try { switch (action.type) {
export const initialUserState = {
username: '',
address: '',
token: '',
address: '',
loggedIn: false,
loaded: false,
};
export const userReducer = async (state, action) => {
try {
switch (action.type) {
case 'LOAD':
try {
const value = JSON.parse(await AsyncStorage.getItem('user_info'));
const newState = { ...state, ...value, loggedIn: true, loaded: true };
console.log('New State:', newState);
if (value !== null) {
return newState;
}
} catch (error) {
return { ...state, loaded: true };
}
break;
default:
return state;
}
} catch (error) {
console.log(error);
return state;
}
};
我的App.js:
import { userReducer, initialUserState } from './reducer';
const App = () => {
const [user, dispatch] = useReducer(userReducer, initialUserState);
useEffect(() => {
dispatch({ type: 'LOAD', ready: setReady });
}, []);
useEffect(() => {
console.log('state user:', user);
}, [user]);
}
export default App;
在App.js中,调用第二个useffect后,状态更新,并且用户返回一个承诺。承诺有多个属性,其中一个属性是它应该返回的正确状态。它不应该返回状态吗?我做错什么了吗
简言之:
1) 应用程序启动
2) useEffect第一次调用并且具有正确的初始状态
3) 我调用加载操作来更新状态
4) 第二次调用useffect。这次它返回一个承诺,我想它应该只返回商店的更新状态
看起来您传递给
useReducer
的函数是async
。所有async
函数都返回一个承诺。您需要等待或使用。然后语法从承诺中获取值。它不是第一次通过的承诺,因为它返回初始状态。希望有帮助 它返回一个承诺,因为reducer是一个异步函数,这是因为等待调用AsyncStorage
:
const value = JSON.parse(await AsyncStorage.getItem('user_info'));
您应该将存储回迁移到一个effect钩子中,然后dispatch
解析/拒绝承诺的结果
将数据取出的另一个原因是还原器应该是(这是指向Redux文档的链接,但这个想法仍然适用于React还原器)。减速器应具有的唯一数据源是其
状态
和动作
参数。这就允许关于这些参数的确定性行为;给定相同的参数,单独的reducer调用应始终返回相同的结果。您将使用redux thunk进行异步操作,并将请求移动到操作创建者,所以这个问题是关于React hook的“reducer”而不是redux,对吗?你能把redux thunk和react挂钩一起使用吗?谢谢,我试过了,没有返回承诺,而是返回未定义的,我不知道为什么。正如@bsapaka提到的,我将逻辑从减速器内部移动到外部,并将数据作为有效负载传递。它工作了,但现在我无法访问其他组件中的减速器,它总是返回初始状态。我要搬到Redux去。我不需要任何复杂的东西,但我厌倦了浪费时间。谢谢,我做到了,我将逻辑从减速器内部移动到外部,并将数据作为有效负载传递。它工作了,但现在我无法访问其他组件中的减速器,它总是返回初始状态。我要搬到Redux去。我不需要任何复杂的东西,但我已经厌倦了浪费时间。如果您需要其他组件中的状态,请将reducer向上移动,直到所有需要数据的组件都位于具有reducer的组件下