我正在尝试创建一个可以累计测试分数的触发器,然后根据之前的测试结果计算学生的位置。
我试图在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
答案 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);
});
}
});