【发布时间】: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