Javascript Promise.all从Firebase返回错误的快照
我创建了一个很有趣的小消息应用程序,我试图获取用户之间的对话,我做了一个加入查询,因为我在firebase上对我的模式进行了非规范化 这是我的模式:Javascript Promise.all从Firebase返回错误的快照,javascript,firebase,firebase-realtime-database,promise,Javascript,Firebase,Firebase Realtime Database,Promise,我创建了一个很有趣的小消息应用程序,我试图获取用户之间的对话,我做了一个加入查询,因为我在firebase上对我的模式进行了非规范化 这是我的模式: 消息具有唯一的id,该id是两个用户的组合,并且具有消息对象的子对象 用户拥有会话集合,会话密钥是其他用户id 我在js端的查询: 我的问题 fetchConversations返回的是对话,而不是用户和消息。如何返回用户和消息 我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决
- 消息具有唯一的id,该id是两个用户的组合,并且具有消息对象的子对象
- 用户拥有会话集合,会话密钥是其他用户id
- fetchConversations返回的是对话,而不是用户和消息。如何返回用户和消息
- 我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决了它:
export function fetchConversations(userId) {
return (dispatch) => {
dispatch(fetchingConversations());
const users = [];
const messages = [];
const rootRef = firebase.database().ref();
return rootRef
.child('users')
.child(userId)
.child('conversations')
.once('value')
.then((conversationSnapshots) => {
const promises = [];
conversationSnapshots.forEach((conversation) => {
const { conversationId } = conversation.val();
promises.push(
rootRef
.child('users')
.child(conversation.key)
.once('value')
.then((user) => {
const _user = Object.assign({ id: conversation.key }, user.val());
users.push(_user);
}),
);
promises.push(
rootRef
.child('messages')
.child(conversationId)
.limitToLast(1)
.once('value')
.then((message) => {
const _message = message.val();
messages.push(_message[Object.keys(_message)[0]]);
}),
);
});
return Promise.all(promises);
})
.then(() => {
const data = [];
for (let i = 0; i < users.length; i++) {
data.push({
id: users[i].id,
receiver: { name: users[i].name, image: users[i].image },
lastMessage: messages[i].text,
lastMessageDate: moment(messages[i].createdAt),
});
}
dispatch(fetchingConversationsSuccess(data));
});
};
}
导出函数fetchConversations(userId){
返回(发送)=>{
分派(获取对话());
常量用户=[];
常量消息=[];
const rootRef=firebase.database().ref();
返回rootRef
.child(“用户”)
.child(用户ID)
.child(“对话”)
.once('值')
.然后((对话快照)=>{
常量承诺=[];
conversationSnapshots.forEach((对话)=>{
const{conversationId}=conversation.val();
承诺,推动(
根参考
.child(“用户”)
.child(对话.key)
.once('值')
。然后((用户)=>{
const_user=Object.assign({id:conversation.key},user.val());
用户推送(_user);
}),
);
承诺,推动(
根参考
.child(“消息”)
.child(会话ID)
.limitToLast(1)
.once('值')
。然后((消息)=>{
const_message=message.val();
messages.push(_message[Object.keys(_message)[0]]);
}),
);
});
返回承诺。全部(承诺);
})
.然后(()=>{
常量数据=[];
for(设i=0;i
我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决了它:
export function fetchConversations(userId) {
return (dispatch) => {
dispatch(fetchingConversations());
const users = [];
const messages = [];
const rootRef = firebase.database().ref();
return rootRef
.child('users')
.child(userId)
.child('conversations')
.once('value')
.then((conversationSnapshots) => {
const promises = [];
conversationSnapshots.forEach((conversation) => {
const { conversationId } = conversation.val();
promises.push(
rootRef
.child('users')
.child(conversation.key)
.once('value')
.then((user) => {
const _user = Object.assign({ id: conversation.key }, user.val());
users.push(_user);
}),
);
promises.push(
rootRef
.child('messages')
.child(conversationId)
.limitToLast(1)
.once('value')
.then((message) => {
const _message = message.val();
messages.push(_message[Object.keys(_message)[0]]);
}),
);
});
return Promise.all(promises);
})
.then(() => {
const data = [];
for (let i = 0; i < users.length; i++) {
data.push({
id: users[i].id,
receiver: { name: users[i].name, image: users[i].image },
lastMessage: messages[i].text,
lastMessageDate: moment(messages[i].createdAt),
});
}
dispatch(fetchingConversationsSuccess(data));
});
};
}
导出函数fetchConversations(userId){
返回(发送)=>{
分派(获取对话());
常量用户=[];
常量消息=[];
const rootRef=firebase.database().ref();
返回rootRef
.child(“用户”)
.child(用户ID)
.child(“对话”)
.once('值')
.然后((对话快照)=>{
常量承诺=[];
conversationSnapshots.forEach((对话)=>{
const{conversationId}=conversation.val();
承诺,推动(
根参考
.child(“用户”)
.child(对话.key)
.once('值')
。然后((用户)=>{
const_user=Object.assign({id:conversation.key},user.val());
用户推送(_user);
}),
);
承诺,推动(
根参考
.child(“消息”)
.child(会话ID)
.limitToLast(1)
.once('值')
。然后((消息)=>{
const_message=message.val();
messages.push(_message[Object.keys(_message)[0]]);
}),
);
});
返回承诺。全部(承诺);
})
.然后(()=>{
常量数据=[];
for(设i=0;i
是的,添加了child\u后,您不能使用承诺。那么我应该使用什么来代替添加的child\u?对不起,我不知道firebase。难道没有什么方法可以让你们所有的孩子都得到满足吗?我想,我可以使用value listener,但我不知道如何通过内部查询返回承诺。是的,添加了child\u
listener,你们就不能使用承诺。那个么我应该用什么来代替添加的child\u呢?对不起,我不知道firebase。难道没有什么方法可以让你们所有的孩子都明白吗?我想,我可以使用value listener,但我不知道如何用内部查询返回承诺。
export function fetchConversations(userId) {
return (dispatch) => {
dispatch(fetchingConversations());
const users = [];
const messages = [];
const rootRef = firebase.database().ref();
return rootRef
.child('users')
.child(userId)
.child('conversations')
.once('value')
.then((conversationSnapshots) => {
const promises = [];
conversationSnapshots.forEach((conversation) => {
const { conversationId } = conversation.val();
promises.push(
rootRef
.child('users')
.child(conversation.key)
.once('value')
.then((user) => {
const _user = Object.assign({ id: conversation.key }, user.val());
users.push(_user);
}),
);
promises.push(
rootRef
.child('messages')
.child(conversationId)
.limitToLast(1)
.once('value')
.then((message) => {
const _message = message.val();
messages.push(_message[Object.keys(_message)[0]]);
}),
);
});
return Promise.all(promises);
})
.then(() => {
const data = [];
for (let i = 0; i < users.length; i++) {
data.push({
id: users[i].id,
receiver: { name: users[i].name, image: users[i].image },
lastMessage: messages[i].text,
lastMessageDate: moment(messages[i].createdAt),
});
}
dispatch(fetchingConversationsSuccess(data));
});
};
}