【问题标题】:Cloud Functions for Firebase - Looping with PromisesFirebase 的云函数 - 使用 Promise 循环
【发布时间】:2018-01-21 05:16:12
【问题描述】:

我正在尝试创建一个触发器,该触发器将把测试分数相加,然后根据之前的测试结果计算学生的排名。

我正在尝试在 FOR 循环中使用 Promise,如下所示:

exports.boxScoresUpdate = functions.database.ref('/Tests/{id}/TestScores').onWrite(event => {

    let testScr = 0;

    for (let i = 1; i <= section; i++) {
        //
        testScr += parseInt(nValue[i]);

        var index;

         admin.database().ref('TestScores').child(data.key).child('Summative').child(i).once("value").then(x => {

            xIndex = x.val();


             admin.database().ref('TestScores').child(data.key).child('Formative').child(i).once("value")
        }).then(y => { 

                yIndex = y.val();


                 admin.database().ref('StudentPlacement').child(data.key).child(xIndex + ":" + yIndex).once("value", snapshot => {

                     // SnapShot
                     console.log("Student Placement is: ", snapshot.val());

                });

        }).catch(reason => {

              // Handle Error
              console.log(reason);

        });
    }
}

我被告知不会像 post 中看到的那样工作。

“一旦一个 Promise 被解决或拒绝,它就永远保持该状态并且不能再次使用。要重复这项工作,我认为你必须构建另一个代表第二次工作迭代的新 Promise 链。 "

我一直在尝试重组我的触发器,但我无法弄清楚,我将如何构建新的承诺链来实现我想要的结果?!有没有人遇到并克服过这个问题?

我希望实现的行为是使触发器迭代四 (4) 次迭代 section 等于 4。

我需要利用 Promise,否则迭代将无法正确完成,特别是 testScr += parseInt(nValue[i]); 以及对 Summative 和 Formative 的查找。

但如前所述,使用 Promises 可以完美运行,只是它只针对第一个实例进行迭代,而不是在 i = 2 or 3 or 4 时进行迭代

【问题讨论】:

  • 您分享的代码不是云函数。我不太清楚你是如何触发这个的,你期望什么行为,以及你实际得到什么行为。请准确地使用该信息更新您的问题。您还需要在最里面的 once() 回调中修复未终止的字符串。
  • 它只进行了一次迭代,因为您将在循环中间使用return 语句返回整个函数。将return 放在那里不会让循环完成。
  • @DougStevenson 你指的是哪个回报?!你能提供我应该如何构建我的代码吗?
  • return 位于 for 循环的主体中。您应该将所有工作的所有承诺收集到一个数组中,然后从Promise.all() 返回承诺以等待一切完成。
  • 所以我删除了return,所以迭代继续......但我收到一个错误TypeError: Cannot read property 'val' of undefined at admin.database.ref.child.child.child.once.then.then.y (/user_code/index.js:175:72),我不知道为什么!?如果return 存在,我不会收到此错误...但它只迭代一次!?

标签: javascript firebase firebase-realtime-database google-cloud-functions firebase-admin


【解决方案1】:

这种方法不是那么干净,但可能会对您有所帮助。

exports.boxScoresUpdate = functions.database.ref('/Tests/{id}/TestScores').onWrite(event => {

  let testScr = 0;

  for (let i = 1; i <= section; i++) {
    //
    testScr += parseInt(nValue[i]);

    var index;

    admin.database().ref('TestScores').child(data.key).child('Summative').child(i).once("value").then(x => {
      xIndex = x.val();
      return { xIndex, index: i };
    }).then(({ xIndex, index}) => {
      admin.database().ref('TestScores').child(data.key).child('Formative').child(index).once("value").then(y => {
        yIndex = y.val();
        return { yIndex, xIndex };
      }).then(({ yIndex, xIndex}) => {
        admin.database().ref('StudentPlacement').child(data.key).child(xIndex + ":" + yIndex).once("value", snapshot => {
          console.log("Student Placement is: ", snapshot.val());
        });
      });        
    }).catch(reason => {
      console.log(reason);
    });
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2021-05-31
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多