react-native - React Native Workflow,处理 429 错误和数据
问题描述
我在这里寻找一些指导,我正在使用 redux 开发一个 RN 应用程序,每次我在应用程序上进入一个新屏幕时,我的 useEffect() 中肯定有一个“callinitialData”函数,使用 axios 获取 api 数据到被 dispatch() 到 redux 状态。
一切正常,但是每当我从一个屏幕跳到另一个屏幕时,有时我会收到很多请求的 429 错误,所以我只是设置了 redux-persist 希望这将有助于减少请求量,在我看来,如果我的 api数据等于我的本地数据,不需要提出该请求。
但是它保持不变,所以我在想最好的方法是什么,登录时尝试一次获取所有数据>将其存储在 asyncstorage 和 redux 中,然后在每个屏幕上获取它?
那么,如果我在登录时获取所有数据,我将如何能够实时从 api 接收新数据集?
应用功能 -
- 编辑个人资料(img、pass、email、name)
- 数据表格(请求 X、提交数据、编辑表格)
- 通过联系人聊天/创建群聊
代码示例
const ChatScreen = ({ auth: { user }, getChatContacts, chat: { contacts }, navigation }) => {
useEffect(() => {
getChatContacts();
}, []);
const onChatUser = async (_id, name, roomID) => {
console.log(_id, name, roomID, contacts.payload.clone)
navigation.navigate( "Message", {
_id, name, chatRoomId: roomID, allUsers: contacts.payload.clone
});
}
const renderItem = ({ item , index } ) => {
let userName = "";
item.users.map((users, index) => {
let idToCheck = users.toString() !== user._id.toString() ? users : false;
if (idToCheck) {
let getOneUser = contacts.payload.clone.find(x => x._id === idToCheck);
userName += "" + getOneUser.name + ", ";
}
})
return (<TouchableOpacity key={item._id} onPress={() => onChatUser(item._id, item.name, item.roomID)}>
<View style={styles.chatContainer}>
<FontAwesome name="user-circle-o" size={50} color="#000000"/>
<Text style={styles.chatTitle}>{ ((userName).length > 32) ?
(((userName).substring(0,32-3)) + '...') :
userName }</Text>
<FontAwesome name="angle-right" size={25} color="#000000"/>
</View>
</TouchableOpacity>)
};
return (
<SafeAreaView style={styles.container}>
<TextInput
autoCapitalize="none"
autoCorrect={false}
clearButtonMode="always"
placeholder="Search friend"
style={styles.chatsearch}
/>
{contacts ?
(<FlatList
data={contacts.payload.allContact}
renderItem={(item, index) => renderItem(item, index)}
keyExtractor={item => item.id}
style={styles.FlatListContainer}
/>) : (<Text style={styles.FlatListContainer}></Text>)
}
</SafeAreaView>
);
}
const styles = StyleSheet.create({});
ChatScreen.propTypes = {
isAuthenticated: PropTypes.bool,
auth: PropTypes.object,
};
const mapStateProps = state => ({
auth: state.auth,
chat: state.chat
});
export default connect(mapStateProps, {getChatContacts} )(ChatScreen);
还原动作
export const getChatContacts = () => async dispatch => {
const config = {
header: {
"Content-Type": "application/json"
}
}
try {
const res = await axios.get(API_LINK +"/users/getChatContacts",);
dispatch({
type: GET_CONTACT_CHAT,
payload: res.data
});
} catch (err){
console.log(err)
dispatch({
type: ERROR_FAMILY_PARENT,
payload: { msg: err.response, status: err.response}
});
}
};
解决方案
推荐阅读
- sql - 检索与一组商品一起出售的所有订单
- ios - 获取 Cocoapods 自动设置正确的 swift 版本
- ios - 如何让 UIlabel 自动动态跨越多行。在具有多个 UIlabels 的 Tableview 单元格/ContentView 内
- git - 多个 Git(*) 存储库的集中式 CI
- node.js - 在其目录之外运行 NodeJS 应用程序
- python - 通过 PIL 将 Numpy 数组保存为实验室图像
- python - sqlalchemy.exc.ArgumentError:映射器映射类无法为映射表“用户”组装任何主键列
- visual-studio-code - 如何在 Vscode 中使片段建议区分大小写?
- image - 如何将 TVIPS 摄像头的 tif 校准导入 DM
- python - 循环遍历一系列日期以进行比较