チームメンバーがFirebaseデータベースに存在しない場合は、新しいチームメンバーを追加します。しかし、私は既存のエントリを読んでいる間に時間の遅れを見る。以下のコードは、変数teammembertKey
に対してnullを返します。したがって、システムに再ログインするたびにデータベースに新しい鍵が表示されます。誰かが私にこの問題を解決するのを助けることができますか?child_addedリスナーの遅延時間
checkIfUserExists = function (teammemberData) {
return firebase.database().ref().child('/leaders/' + firebase.auth().currentUser.uid)
.once("value", function (snapshot) {
console.log(snapshot.exists());
return Promise.resolve({
teammemberData,
userExists: snapshot.exists(),
});
});
};
$scope.submit = function() {
var teammembertKey = null;
// A teammember entry.
// A teammember entry.
var teammemberData = {
uid: firebase.auth().currentUser.uid,
email: firebase.auth().currentUser.email,
displayName: firebase.auth().currentUser.displayName,
photoURL: firebase.auth().currentUser.photoURL
};
const p = checkIfUserExists(teammemberData);
p.then((snapshot, userExists) => {
if (userExists) {
teammembertKey = snapshot.key;
// update user
} else {
// go create a user
console.log('i');
}
})
.catch(err => {
console.warn('Error signing in.', err);
});
if (teammembertKey == null) {
// Get a key for a new team member.
teammembertKey = firebase.auth().currentUser.uid; //firebase.database().ref().push().key;
// Write the new member's data simultaneously.
var updates = {};
updates['/leaders/' + teammembertKey] = teammemberData;
const promise = firebase.database().ref().update(updates);
promise
.then(e => { })
.catch(e => {
console.log(e);
})
}
};
あなたはhttps://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-callを参照して、非同期コールバックで間違って扱っています。クイックソリューションは、 'child_added'イベント関数内で' if(teammembertKey == null) 'から始まるすべてのコードを入れてください –
私は同じノード/ leaderに追加しているのでできません – softsara
大丈夫です。値をチェックしているだけで 'child_added'を使わず、' value'を使うのは正しいでしょう。 'ref.orderByChild( 'email')。equalTo(firebase.auth()。currentUser.email).once( 'value'、function(snap){...})'そして、あなたの更新をコールバック関数の中に入れることができます。 –