javascript - 如何在 javascript 中实现 Firebase 数据库中的承诺?
问题描述
我是 javascript 的初学者,这是我第一次在这里提问。我一直在做一个 Firebase 项目。我需要从 Firebase 数据库中获取分数,对其进行一些计算,然后将其保存回 Firebase 数据库。
然而,这些类型的功能需要时间。我已将 setTimeout 用于调试和测试目的,并且运行良好。然而,这不是正确的做法。我必须使用承诺。如何在我的代码中实现承诺?
setTimeout(async () => {
var Ra;
var Rb;
let ref = firebase.database().ref("poeple");
let query = ref.orderByChild("name").equalTo(firstName);
const snapshot = await query.once("value")
if (snapshot.exists()) {
snapshot.forEach((userSnapshot) => {
var userData = userSnapshot.val();
Ra = userData.score;
});
}
let opponentQuery = ref.orderByChild("name").equalTo(hisOpponent);
const snapshotTwo = await opponentQuery.once("value")
if (snapshotTwo.exists()) {
snapshotTwo.forEach((userSnapshot) => {
var userData = userSnapshot.val();
Rb = userData.score;
});
}
var expectedA = 1 / (1 + Math.pow(10, (Rb - Ra) / 400));
var expectedB = 1 / (1 + Math.pow(10, (Ra - Rb) / 400));
var newRa = Ra + 32 * (1 - expectedA);
var newRb = Rb + 32 * (0 - expectedB);
var finalQuery = await ref.orderByChild("name").equalTo(firstName);
finalQuery.once("child_added", function(snapshot) {
snapshot.ref.update({score: newRa})
});
var opponentFinalQuery = await ref.orderByChild("name").equalTo(hisOpponent);
opponentFinalQuery.once("child_added", function(snapshot) {
snapshot.ref.update({score: newRb})
});
}, 1000);
解决方案
它在 setTimeout() 中起作用的原因是您已经声明了一个异步函数。这就是你在这里使用 async/await 所需要的:
async function doWork() {
const foo = await ...;
return foo;
}
const foo = doWork();
您可以跳过 setTimeout 调用,直接调用该函数。
推荐阅读
- python - 令牌授权失败时从连接烧瓶服务器发送自定义响应
- laravel - 使用 firstWhere 访问 Laravel Blade 中的属性
- html - href 链接不可点击(似乎在 chrome 检查中工作)
- python - 在python中移动缺少数据的行
- javascript - 数组的总和索引值
- java - 使用 List 属性测试 Bean 时出现问题
- java - 如何使用 .bat 文件中的特定 JRE 版本运行 .jar 文件?
- javascript - 如何通过电子执行操作系统粘贴操作
- php - php pdo where 子句
- html - 如果第二个 div 不存在,如何将两个 div 并排放置,第一个填充宽度为 100%?