2

私は、テストのスコアを加算し、以前のテスト結果に基づいて生徒のプレースメントを計算するトリガを作成しようとしています。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

+0

あなたが共有したコードは、クラウド機能ではありません。私はあなたがどのようにこれを引き起こし、どのような行動を期待しているのか、実際にどのような行動を取るのかは、はっきりしていません。あなたの質問を正確に更新してください。また、最終の 'once()'コールバックで終端されていない文字列を修正したいと思うでしょう。 –

+0

ループの途中で 'return'ステートメントを使って関数全体から戻ってくるので、1回の繰り返ししかありません。 'return'を置くと、ループは終了しません。 –

+0

@DougStevensonあなたはどんなリターンですか?私のコードをどのように構造化すべきかを教えてください。 – Learn2Code

答えて

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); 
    }); 
    } 
}); 
関連する問題