日安,
我正在尝试实现@mentions,这样用户就可以@其他用户了。
事情进展得很好,我已经差不多完成了,但我在最后一部分遇到了麻烦。
我试图通过使用regex来捕获他们的用户名来循环那些提到过的用户。我已经完成了,现在我的问题出现在我的循环中。
以下是我正在研究的内容:
onPostPress = async () => {
this.setState(
{
addingComment: true,
},
() => {
const re = /(?:^|[ ])@([a-zA-Z]+)/gm;
const str = this.state.usersCommentText;
var m;
let mentionsArr = [];
//OBJECT TO STORE IN USERS NODE
let men = {
username: this.props.userData.username,
profileImg: this.props.userData.profilePic || null,
};
//INITIALIZE MULTI-PATH UPDATE
const mentions = {};
while ((m = re.exec(str)) != null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
//THIS WORKS
mentionsArr.push(m[1]);
//THIS DOESN'T WORK :(
await firebase
.database()
.ref('users')
.orderByChild('username')
.equalTo(`${m[1]}`)
.once('value', snapshot => {
snapshot.forEach(child => {
mentions[`/users/${child.key}/men`] = men;
});
});
}
firebase
.database()
.ref()
.update(mentions);
},
);}如您所见,我正在遍历标记的用户,并试图将men对象设置为用户节点,这样我就可以触发一个云函数来发送通知,通知已经提到的用户。
当它完成后,我继续推送评论--但我不明白为什么这不起作用。
我可以从循环推送到数组中,没有任何问题,但不能推到firebase RTDB。
我希望在这个问题上有所帮助,让我朝着正确的方向前进,干杯!
发布于 2020-03-30 22:59:09
//THIS DOESN'T WORK :(
firebase
.database()
.ref('users')
.orderByChild('username')
.equalTo(`${m[1]}`)
.once('value', snapshot => {
snapshot.forEach(child => {
mentions[`/users/${child.key}/men`] = men;
});
});“它不工作”,因为它是异步的。你需要在做之前先做await
firebase
.database()
.ref()
.update(mentions);否则,在执行mentions时,update对象将为空。
我还认为您的while循环不应该包括最后一部分。您的意思是在循环中构建您的mentions,然后执行update,不是吗?
https://stackoverflow.com/questions/60936942
复制相似问题