gpt4 book ai didi

javascript - 在 React Redux 的 Action Creators 中返回带有 Promise 的调度

转载 作者:行者123 更新时间:2023-11-28 17:10:10 25 4
gpt4 key购买 nike

我的 /actions/authenticate.js 中有一个 actionCreators 来分隔由 redux< 调度的 actions 的逻辑/strong> 和 react组件

这是我的authenticate.js,它是我的actionCreators

export function login(email, password) { // Fake authentication function
return async dispatch => {
dispatch(loginRequest()); // dispatch a login request to update the state
try {
if (email.trim() === "test123@nomail.com" && password === "123456") { //If the email and password matches
const session = { token: "abc1234", email: email, username: "test123" } // Create a fake token for authentication
await AsyncStorage.setItem(DATA_SESSION, JSON.stringify(session)) // Stringinfy the session data and store it
setTimeout(() => { // Add a delay for faking a asynchronous request
dispatch(loginSuccess(session)) // Dispatch a successful sign in after 1.5 seconds
return Promise.resolve()
}, 1500)
} else { // Otherwise display an error to the user
setTimeout(() => { // Dispatch an error state
dispatch(loginFailed("Incorrect email or password"))
}, 1500)
}
} catch (err) { // When something goes wrong
console.log(err)
dispatch(loginFailed("Something went wrong"));
return Promise.reject()
}
};
} // login

然后我将其导入到我的 someComponent.js 中以导入 actionCreator 并使用 bindActionCreators 绑定(bind)它。

类似下面的内容:

import { bindActionCreators } from "redux";
import * as authActions from "../actions/authenticate";
import { connect } from "react-redux";

然后我将该操作连接到我的组件,即 Login.js

export default connect(
state => ({ state: state.authenticate }),
dispatch => ({
actions: bindActionCreators(authActions, dispatch)
})
)(Login);

因此我可以直接在 Login.js

中调用该 actionCreator 中的函数

类似下面的内容:

onPress={() => {                                 
this.props.actions.login(this.state.email, this.state.password)
}}

但是我想要发生的是这个函数将分派(dispatch)一个redux操作并且如果可能的话还返回一个Promise

类似这样的事情:

onPress={() => {                                 
this.props.actions.login(this.state.email, this.state.password)
.then(() => this.props.navigation.navigate('AuthScreen'))
}}

我想要发生的是当我尝试登录时。调度那些异步 redux thunk 操作并返回一个 promise 。如果已解决,我可以重定向或导航到正确的屏幕。

感谢有人可以提供帮助。提前致谢。

最佳答案

您的第一种方法基本上是正确的。 dispatch(thunkAction()) (或者在你的情况下 this.props.actions.login() 返回任何 thunkAction() 返回的内容,所以它如果是异步确实返回Promise。

问题在于 Promise 解析的内容,即从 async 函数返回的内容。在您的情况下,无论凭据是否正确,您都不会等待 setTimeout 而是返回 void

因此,就异步函数而言,您需要类似的东西

export function login(email, password) { // Fake authentication function
return async dispatch => {
dispatch(loginRequest()); // dispatch a login request to update the state
try {
if (email.trim() === "test123@nomail.com" && password === "123456") { //If the email and password matches
const session = { token: "abc1234", email: email, username: "test123" } // Create a fake token for authentication
await AsyncStorage.setItem(DATA_SESSION, JSON.stringify(session)) // Stringinfy the session data and store it
// Add a delay for faking a asynchronous
await new Promise((resolve, reject) => setTimeout(() => resolve(), 1500));
dispatch(loginSuccess(session));
return Promise.resolve(true);
} else { // Otherwise display an error to the user
await new Promise((resolve, reject) => setTimeout(() => resolve(), 1500));
dispatch(loginFailed("Incorrect email or password"))
return Promise.resolve(false);
}
} catch (err) { // When something goes wrong
console.log(err)
dispatch(loginFailed("Something went wrong"));
return Promise.reject()
}
};
} // login

这样,您的异步函数就会解析为您可以在组件中使用的 true/false:

onPress={() => {                                 
this.props.actions.login(this.state.email, this.state.password)
.then((login_succeeded) => this.props.navigation.navigate('AuthScreen'))
}}

您还可以返回dispatch(loginSuccess(session));(只要返回它的是thunk而不是setTimeout处理程序),在这种情况下loginSuccess(session).then() 将在您的 onPress Hook 中获得的内容。

关于javascript - 在 React Redux 的 Action Creators 中返回带有 Promise 的调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com