在react native中使用Object.keys(x).map()时,如何等待来自firebase数据库的数据?

在react native中使用Object.keys(x).map()时,如何等待来自firebase数据库的数据?,firebase,react-native,firebase-realtime-database,Firebase,React Native,Firebase Realtime Database,我试图在列表中显示组中用户的信息。我想收集关于每个成员的附加信息,这些信息存储在我的数据库中的users/下 我的代码设法收集信息,但只收集第一个成员的信息。要加载其他成员的数据,我需要导航回另一个屏幕,然后返回 以下是我迄今为止所做的尝试: //组/id/members中的members对象被传递到此函数 //e、 g.[{“uid”:“abc”,“type”:“admin”},{“uid”:“def”,“type”:“member”},{“uid”:“ghi”,“type”:“member”

我试图在列表中显示组中用户的信息。我想收集关于每个成员的附加信息,这些信息存储在我的数据库中的
users/

我的代码设法收集信息,但只收集第一个成员的信息。要加载其他成员的数据,我需要导航回另一个屏幕,然后返回

以下是我迄今为止所做的尝试:

//组/id/members中的members对象被传递到此函数
//e、 g.[{“uid”:“abc”,“type”:“admin”},{“uid”:“def”,“type”:“member”},{“uid”:“ghi”,“type”:“member”}]
getMembersData(成员){
常数membersData={};
Object.key(members.map)(key,i)=>{
常量成员=成员[键];
firebase.database().ref(`users/${member.uid}`)。on('value',snap=>{
membersData[member.uid]={
“uid”:member.uid,
“用户名”:snap.child('username').val(),
“imageUrl”:snap.child('imageUrl').val(),
“类型”:member.type,
};
});
});
this.setState({membersData});
}
换句话说,当我导航到members屏幕时,在视图中映射this.state.membersData时,仅呈现第一个成员的信息,直到我退出屏幕并返回到它为止


如果我删掉firebase内容,代码工作正常。如何解决此问题,以便在导航到屏幕时加载所有内容?

我认为您需要在数据库回调中调用setState,因为回调是异步的,并且在数据最终可用之前不会被调用

    firebase.database().ref(`users/${member.uid}`).on('value', snap => {
      membersData[member.uid] = {
        'uid': member.uid,
        'username': snap.child('username').val(),
        'imageUrl': snap.child('imageUrl').val(),
        'type': member.type,
      };
       this.setState(membersData);
    });
  });

无法保证获取数据需要多长时间,因此您的代码应该准备好处理可能需要一段时间才能到达的事实(如果没有internet连接,则可能永远不会到达)。

您希望在所有数据库调用完成后调用
this.setState
。如果您只需要下载一次数据,您可以使用

因为您使用的是
.map()
,所以可以通过从使用
.one('value')
的数据库请求返回承诺来实现这一点。在下面的代码中,名为
transformPromissions
的变量是由
.map()
.once('value')
生成的承诺数组。一旦有了这个承诺数组,就可以使用
promiseArray.all(promiseArray)。然后(()=>{…}
等待它们全部解析。在下面的代码中,我们调用
this.setState()
来更新用户界面

在调用
getMembersData()
之前,在加载数据时显示

getMembersData(成员){
常数membersData={};
让transformPromises=Object.key(members.map)(key,i)=>{
常量成员=成员[键];
返回firebase.database().ref(`users/${member.uid}`)
。然后(snap=>{
membersData[member.uid]={
“uid”:member.uid,
“用户名”:snap.child('username').val(),
“imageUrl”:snap.child('imageUrl').val(),
“类型”:member.type,
};
});
});
承诺。所有(承诺)
.然后(()=>{
//已成功下载并添加所有数据。
this.setState({membersData});
})
.catch((错误)=>{
//处理错误
控制台错误(err)
});
}
注意:根据
成员的形状,您还可以使用以下代码对其进行迭代:

let transformPromissions=members.map(member=>{
返回firebase.database().ref(`users/${member.uid}`)
。然后(snap=>{
membersData[member.uid]={
“uid”:member.uid,
“用户名”:snap.child('username').val(),
“imageUrl”:snap.child('imageUrl').val(),
“类型”:member.type,
};
});
}