Javascript firebase.firestore.FieldValue.serverTimestamp()创建一个;修改的;尝试插入快照条目时,将其删除

Javascript firebase.firestore.FieldValue.serverTimestamp()创建一个;修改的;尝试插入快照条目时,将其删除,javascript,firebase,ionic-framework,google-cloud-firestore,Javascript,Firebase,Ionic Framework,Google Cloud Firestore,对不起,我不知道,这是一个问题,还是我无法以正确的方式使用它 我面临的问题是 我正在尝试创建一个新文档,其中包含某些字段,其中一个字段正在创建中,当我尝试使用onSnapshot()侦听器检索新输入的文档时,会出现问题。 onSnapshot()监听器会被触发两次,一次是添加类型,之后是修改类型,这是因为没有同时插入firebase.firestore.FieldValue.serverTimestamp()的值 下面是用于添加文档的代码段 senderid : this

对不起,我不知道,这是一个问题,还是我无法以正确的方式使用它

我面临的问题是

我正在尝试创建一个新文档,其中包含某些字段,其中一个字段正在创建中,当我尝试使用onSnapshot()侦听器检索新输入的文档时,会出现问题。 onSnapshot()监听器会被触发两次,一次是添加类型之后是修改类型,这是因为没有同时插入firebase.firestore.FieldValue.serverTimestamp()的值

下面是用于添加文档的代码段

            senderid : this.buddy.senderId,
            receiverid: this.buddy.receiverId,
            message : msg,
            created: firebase.firestore.FieldValue.serverTimestamp()

下面是阅读文档的代码:

   this.db.collection(this.collectionName.friendsCollection).doc(this.buddy.docid)
     .collection(this.collectionName.chatsCollection).orderBy('created')
     .onSnapshot(snapshot=> {
       skip.buddymessages = [];
       if(snapshot.empty)
       {
         console.log("First Chat");
       }
       else{
         console.log("size",snapshot.size)
         snapshot.docChanges.forEach(change => {
           if (change.type === 'added') {
             console.log('New : ', change.doc.data());
           }
           if (change.type === 'modified') {
             console.log('Modified : ', change.doc.data());
           }
           if (change.type === 'removed') {
             console.log('Removed : ', change.doc.data());
           }
         });
以下是控制台屏幕截图:-
您看到的是预期的行为。客户端在添加文档信息时会看到它自己的文档信息(您的“已添加”回调-这是考虑在内的),但由于时间戳是在服务器上计算的,因此该时间戳稍后会在服务器上写入,并最终同步回客户端(您的“已修改”回调)。链接文档显示了如何判断快照是否有尚未在服务器上完全提交的挂起写入

检索到的文档具有metadata.hasPendingWrites属性,该属性 指示文档是否具有尚未更改的本地更改 已写入后端。您可以使用此属性来确定 快照侦听器接收到的事件源:

db.collection("cities").doc("SF")
    .onSnapshot(function(doc) {
        var source = doc.metadata.hasPendingWrites ? "Local" : "Server";
        console.log(source, " data: ", doc.data());
    });

我确实有一个解决方法,只是好奇这个问题。解决方法是使用new Date()js方法来获取当前的时间戳。