私は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
は私が考える観察可能なように振舞っています。
質問
コードは一度だけ実行されることを保証するための最良の方法は何ですか?
ありがとうございます。
ありがとうございます。私はそれをテストします。 – Richard
それが私の問題を解決しました。ありがとうございました – Richard