javascript - 异步/等待函数永远不会用 Dispatch 解决
问题描述
在我下面的函数中,addToFlatList
只调用一次,即使我知道我的数据库中有几个项目要添加。好像拳头addToFlatList
永远解决不了?我究竟做错了什么?
photosSnapshot.forEach(async function(childSnapshot) {
await addToFlatList(childSnapshot.key, childSnapshot.val())(dispatch);
});
addToFlatList 函数:
const addToFlatList = (photoId, photoObj) => async(dispatch) => {
database.ref('users').child(photoObj.author).once('value').then((userSnapshot) => {
var userInfo = userSnapshot.val();
dispatch({type: "GOT_USER", payload: userInfo});
}).catch(error => {
dispatch({type: "GOT_ERROR"});
});
}
更新:
试图像这样返回调度。addToFlatList
仍然只调用一次。
const addToFlatList = async(photoId, photoObj) => {
return (dispatch) => {
database.ref('users').child(photoObj.author).once('value').then((userSnapshot) => {
var userInfo = userSnapshot.val();
dispatch({type: "GOT_USER", payload: userInfo});
}).catch(error => {
dispatch({type: "GOT_ERROR"});
});
}
}
也试过这个:
const addToFlatList = async(photoId, photoObj) => {
database.ref('users').child(photoObj.author).once('value').then((userSnapshot) => {
return (dispatch) => {
// never hit this point
var userInfo = userSnapshot.val();
dispatch({type: "GOT_USER", payload: userInfo});
}
}).catch(error => {
dispatch({type: "GOT_ERROR"});
});
}
解决方案
您必须返回承诺:
const addToFlatList = (photoId, photoObj) => (dispatch) => {
return database.ref('users').child(photoObj.author).once('value').then((userSnapshot) => {
// ^^^^^^
var userInfo = userSnapshot.val();
return dispatch({type: "GOT_USER", payload: userInfo});
}).catch(error => {
return dispatch({type: "GOT_ERROR"});
});
};
或者,您必须等待承诺,以免您的async
功能过早结束:
const addToFlatList = (photoId, photoObj) => async (dispatch) => {
try {
const userSnapshot = await database.ref('users').child(photoObj.author).once('value');
// ^^^^^
var userInfo = userSnapshot.val();
return dispatch({type: "GOT_USER", payload: userInfo});
} catch(error) {
return dispatch({type: "GOT_ERROR"});
}
}
推荐阅读
- powershell - 在 Powershell 中,如何使用接受集合的构造函数创建 HashSet?
- reactjs - React:如何保持私有方法绑定到相关组件?
- python - 如何修复 MongoDB 中的聚合查询和更新查询?
- swift - 从 api 调用获取数据后无法更新实例变量
- vhdl - 从 FSM 中的特定统计数据开始
- c++ - c++17: 自动从 std::unique_ptr 移动到 std::shared_ptr
- javascript - 除非打开开发人员模式,否则 JavaScript 无法在 Internet Explorer 11 上运行
- react-native - 我们可以在带有 Expo 的 React Native 项目中使用 Realm 吗?
- r - 使用 dplyr::mutate() 和 ifelse() 在 R 中基于排名顺序的条件变异语句
- r - Autoplot 仅使用 R 中时间序列的寓言绘制 ETS 的预测