适用于Firebase的云功能 - 使用承诺进行循环

时间:2017-08-13 01:38:22

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

我正在尝试创建一个可以累计测试分数的触发器,然后根据之前的测试结果计算学生的位置。

我试图在FOR循环中使用Promises,如下所示:

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中那样工作。

  

&#34;一旦承诺得到解决或拒绝,它将永远保留该状态,不能再次使用。为了重复这项工作,我认为你必须构建另一系列代表第二次工作的新承诺。&#34;

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

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

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

但如上所述,使用Promise工作正常,除了它只针对第一个实例进行迭代,而不是针对i = 2 or 3 or 4

1 个答案:

答案 0 :(得分:0)

这种方法并不干净,但可能对您有所帮助。

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);
    });
  }
});