1

我很努力解决这个问题,因为我是Promises的新手。问题构建循环中的承诺

我需要首先读无论从火力地堡的SummativeFormative之前我可以确定StudentPlacement

方式下面的代码,提供null作为StudentPlacement snapshot.val(),因为它是不等待xy值。

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 xIndex = 0; 
     var yIndex = 0; 


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

     }); 

    } 

} 

谁能帮我构建了扳机!?

回答

1

您正在等待两个函数在执行下一个代码之前完成。看看Promise.all

for (let i = 1; i <= section; i++) { 
    const xIndexRef = admin.database().ref('TestScores').child(data.key).child('Summative').child(i).once("value"); 
    const yIndexRef = admin.database().ref('TestScores').child(data.key).child('Formative').child(i).once("value"); 

    Promise.all([xIndexRef, yIndexRef]) 
     .then(results => { 
     const xSnapshot = results[0]; 
     const ySnapshot = results[1]; 

     return admin.database().ref('StudentPlacement').child(data.key).child(xSnapshot.val() + ":" + ySnapshot.val()).once("value"); 
     }) 
     .then(snapshot => { 
     console.log("Student Placement is: ", snapshot.val()); 
     }); 
} 

Promise.all等待两xIndexRefyIndexRef完成其执行。

一旦执行结果返回到一个可执行的对象。

您可以访问结果并完成执行。

+0

感谢您对此提供的帮助......它工作的非常好,正如我设想的那样正常工作! – Learn2Code