2017-05-30 15 views
1

私はAngularFire2でIonic3を使用してFirebaseデータベースと対話しています。Firebaseデータベースを使用したIonic複数回呼び出されたRef

TS

createMessage(chatItem: any, messageText: string): Promise<firebase.database.ThenableReference> { 
    let offsetRef: firebase.database.Reference = firebase.database().ref(".info/serverTimeOffset"); 
    return new Promise<firebase.database.ThenableReference>((resolve) => { 
     offsetRef.on("value", (snap: firebase.database.DataSnapshot) => { 
      var offset = snap.val(); 
      var negativeTimestamp = (new Date().getTime() + offset) * -1; 

      chatItem.readByReceiver = false; 
      if (chatItem && !chatItem.$key && chatItem.key) { 
       chatItem.$key = chatItem.key; 
      } 
      this.updateChat(chatItem); 

      let ref: firebase.database.ThenableReference = this.af.database.list('/message').push({ 
       chatId: chatItem.$key, 
       memberId1: this.me.uid, 
       memberId2: this.you.uid, 
       username: this.me.displayName, 
       message_text: messageText, 
       timestamp: firebase.database.ServerValue.TIMESTAMP, 
       negativtimestamp: negativeTimestamp, 
       readByReceiver: false 
      }); 
      resolve(ref); 
     }); 
    }); 
} 

これは正常に動作し、Firebaseデータベースにメッセージを書き込みます

は、私は、次のコードを持っています。しかし、メッセージが送信され、データベースに作成された後、約20分後に、新しいが同じメッセージが再び作成されたことに気付きました。コード内のデバッグ文を置き、それが再びトリガするのを待った後、私は次の行を複数回実行するコードを引き起こしていることに気づい:

offsetRef.on("value", (snap: firebase.database.DataSnapshot) => { 
    // breakpoint getting executed more than once here 
}); 

私はそれだけで一度だけ実行されることを期待します関数への呼び出しごとにoffsetRef.onは私が考える観察可能なように振舞っています。

質問

コードは一度だけ実行されることを保証するための最良の方法は何ですか?

ありがとうございます。

答えて

2

あなたは観測値のように機能し、値が変更されるたびにトリガされます。 1度だけ実行されることを確認するには、once('value')を使用してください。 詳細情報:https://firebase.google.com/docs/database/web/read-and-write#read_data_once

offsetRef.once("value").then((snapshot) => { 
    // cod will be executed once here 
}); 
+0

ありがとうございます。私はそれをテストします。 – Richard

+0

それが私の問題を解決しました。ありがとうございました – Richard

関連する問題