私は、テストのスコアを加算し、以前のテスト結果に基づいて生徒のプレースメントを計算するトリガを作成しようとしています。Firebaseのクラウド機能 - 約束を伴うループ
私は、下図のようにFORループ内での約束を利用しようとしています:
私はこの postに見られるように動作しないと言われた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);
});
}
}
。
"Once a promise is resolved or rejected, it forever retains that state and can't be used again. To repeat the work, I think you'd have to construct another chain of new promises representing the second iteration of work."
どのように私は私の望ましい結果を達成するために、約束の新しいチェーンを構築するだろう、私は私のトリガーを再構築しようとしてきたが、私はそれを把握することはできません!誰もこの遭遇して克服したことはありますか?
私は達成するために期待しています動作は4のトリガ反復処理を行うことである(4)の反復section
は、私は反復が正常に完了しないだろう、他の約束、特にtestScr += parseInt(nValue[i]);
ルックアップを利用するために必要な4
に等しく、要約と形成のために。
しかし述べたように、約束を使用すると、最初のインスタンスのための、およびないi = 2 or 3 or 4
あなたが共有したコードは、クラウド機能ではありません。私はあなたがどのようにこれを引き起こし、どのような行動を期待しているのか、実際にどのような行動を取るのかは、はっきりしていません。あなたの質問を正確に更新してください。また、最終の 'once()'コールバックで終端されていない文字列を修正したいと思うでしょう。 –
ループの途中で 'return'ステートメントを使って関数全体から戻ってくるので、1回の繰り返ししかありません。 'return'を置くと、ループは終了しません。 –
@DougStevensonあなたはどんなリターンですか?私のコードをどのように構造化すべきかを教えてください。 – Learn2Code