[英]How to optimize this firebase real time database requests?
我正在构建一个琐事游戏。
用户成功完成一个关卡后,我调用服务器请求打开下一个关卡。 除了打开下一个关卡,我还调用了一个更新用户分数的服务器请求。
您是否有关于如何优化它的建议,以便花费更少的时间,也许取出一个将更新两个字段的服务器请求?
我使用 Firebase 以及它在实时数据库中的外观:
这里有一些代码:
如果答案正确:
const onAnswerPressedHandler = async answer => {
const rightAnswer = answer === selectedLevel.rightAnswer;
dispatch(setShowLoader(true));
if (rightAnswer) {
if (isNotLastLevel) {
await updateRank();
await unlockNextLevelIfExist();
} else if (isNotLastWorld) {
await updateRank();
await unlockNextWorldIfExist();
} else {
await updateRank();
navigation.pop(3);
}
}
dispatch(setShowLoader(false));
};
更新 firebase 中的排名:
export const updateUserScoreAndRank = (score, rank) => new Promise(async (resolve, reject) => {
try {
await database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('score')
.set(score);
await database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('rank')
.set(rank);
resolve();
} catch (e) {
reject(e);
console.log(e);
}
});
解锁下一个级别:
export const setLevelPassed = (worldIndex, levelIndex) => new Promise(async (resolve, reject) => {
try {
await database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_GAME_DETAILS)
.child(firebaseRefs.CURRENT_USER_GAME_DATA)
.child(worldIndex.toString())
.child(firebaseRefs.GAME_QUESTIONS)
.child(levelIndex.toString())
.child(firebaseRefs.IS_LOCKED)
.set(false);
resolve();
} catch (e) {
reject(e);
console.log('setLevelPassed', e);
}
});
知道如何改进请求吗?
您在这里使用了两个单独的await
调用:
export const updateUserScoreAndRank = (score, rank) => new Promise(async (resolve, reject) => {
try {
await database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('score')
.set(score);
await database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('rank')
.set(rank);
resolve();
} catch (e) {
reject(e);
console.log(e);
}
});
这意味着调用是按顺序执行的,只有在两者都完成后,方法返回的 promise 才会解析。
但是这两个调用不以任何方式相互依赖,因此您可以并行执行它们,这样第二个调用就不会等待第一个调用完成。 这样做,您还可以尝试自定义 promise 并从Promise.all()
返回一个:
export const updateUserScoreAndRank = (score, rank) => {
return Promise.all([
database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('score')
.set(score),
database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.child('rank')
.set(rank);
]);
});
对于另一个简化,您可以使用单个多位置更新,而不是两个数据库调用。 这不会再产生显着的性能差异,因为 Firebase 已经通过单个连接对请求进行管道传输,但它会使代码更短一些,并且更新是原子的。
export const updateUserScoreAndRank = (score, rank) => {
return database()
.ref(firebaseRefs.USERS_REF)
.child(auth().currentUser.uid)
.child(firebaseRefs.CURRENT_USER_DETAILS)
.update({ rank, score })
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.