我正在用react-native和pouchdb创建一个用于移动的聊天应用,然后我用socket.io和rethinkdb创建了一个服务器。在PouchDB中,我存储了用户之间的所有聊天,而在rethinkdb中,我存储了“脱机消息”。对于“脱机消息”,我的意思是已发送给不在线用户的消息(我在socket.io服务器中检查了消息)。
现在我遇到了问题。当用户打开应用程序时,我将看到async componentWillMount
:
async componentWillMount(){
const value = await AsyncStorage.getItem("token");
this.setState({ token: value });
var self = this;
await axios.get(server + '/index.php/api/TokenController/isValid', {headers: {Authorization: this.state.token}}).then((res) => {
var resJson = JSON.parse(res.data);
self.setState({userid: resJson.info.id});
});
await axios.get(server + '/index.php/api/FriendsController/getList', {headers: {Authorization: this.state.token}}).then((res) => {
var resJson = JSON.parse(res.data);
this.setState({friends: resJson.friends});
});
this.setState({loading: false});
this.socket.emit('register', {connection_id: this.state.userid});
await this.socket.on('hasMessages', data => Promise.all(data).then(res => {
this.setState({offlineMessages: res});
this.state.offlineMessages.forEach((v) => {
console.log(v) // it stops to first iteration
})
}));
}
因此,用户登录后,我检查令牌是否为isValid,然后获得了好友列表。在那之后,我将我的用户注册到我的websocket,如果有针对我的用户的消息,我将发送“ hasMessage” (示例:
{
"from_id": "76" ,
"id": "e5f76ad6-761c-4637-a118-321a844a9634" ,
"messages": {
"1546799624050": "Ciao" ,
"1546799630274": "Hola" ,
"1546799633100": "Hello"
} ,
"to_id": "1"
}
好的,我的用户有东西。因此,“ hasMessage”的响应就是这样。 现在,我必须执行两个循环(一个循环与数据有关,另一个循环与针对每个数据的消息有关,我必须为所有消息创建一个消息对象)。我怎样才能做到这一点?我使用的Promise有效,但是嵌套的forEach在第一次迭代时停止,当我重新加载应用程序时,我在控制台中看到了其他迭代。
我对async / await / Promise的要求不是很好,我只是在学习!