我有一个简单的调用Firestore来编写一个doc然后在更改父级状态之前等待doc完成写入 . 但是,父状态变化太快,导致读取我认为尚未编写/传播的字段 . 我尝试使用setTimeout添加延迟,它似乎被忽略了 . 如何确保在完全写入Firestore文档后才会调用状态更改?
代码:
updateDBEntry(stateObj) {
var that = this;
var docRef = firebase.firestore().collection('sessions').doc(this.state.userID);
docRef.get().then((doc) => {
if (!doc.exists) {
const timestamp = firebase.firestore.FieldValue.serverTimestamp();
var duration = (stateObj.seshDuration) ? stateObj.seshDuration : 1;
docRef.set({
seshName: stateObj.seshName,
seshStreet: stateObj.seshStreet,
seshZipcode: stateObj.seshZipcode,
seshDuration: duration,
seshDesc: stateObj.seshDesc,
seshTime: timestamp,
}).then(() => {
var handleToUpdate = that.props.handleToUpdate;
setTimeout(() => {
handleToUpdate(1); //this changes the parent's state
}, 10000);
});
}
});
}
1 回答
我不确定你到底遇到的问题,主要是因为你只显示了这个功能,而不是你在应用程序的其余部分中使用它的方式 . 但我可以肯定地告诉你三件事:
当set()的promise成功解析时,您可以确定文档是否已写入 .
get()
和set()
是异步的,then()
也是如此 . 他们都返回承诺代表异步工作 .第2项表示整个函数updateDBEntry()也是异步的,并在任何工作完成之前立即返回 .
因为整个函数是异步的,所以当它返回时,文档还没有被创建 . 相反,也许这个函数应该在所有工作完成后才返回解析,这样调用者也可以使用它设置一些代码在工作完成后执行 .