首页 > 解决方案 > 如何在 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);

标签: javascriptfirebasefirebase-realtime-database

解决方案


它在 setTimeout() 中起作用的原因是您已经声明了一个异步函数。这就是你在这里使用 async/await 所需要的:

async function doWork() {
   const foo = await ...;

   return foo;
}

const foo = doWork();

您可以跳过 setTimeout 调用,直接调用该函数。


推荐阅读