Проблема в том, что db.collection возвращает обещание, и данные еще не доступны, когда вы регистрируете его.
Вы можете попробовать пару вещей здесь:
Переместите ваше установленное состояние в слушатель, если вам небезразлично только состояние React
function pullWorkoutTableData(workoutName){
var exerciseList = [];
db.collection('workouts').get().then((snapshot)=>{
snapshot.docs.forEach(doc => {
if(doc.data().name === workoutName && doc.data().user.includes(user)){
doc.data().exercises.forEach(element =>{
var exercise = [element.name, element.weight, element.reps];
exerciseList.push(exercise);
});
};
});
this.setState({exerciseList}); // <---- HERE
});
return exerciseList;
};
Другая вещь, которую вы можете сделать, это использовать функцию async / await, но, вероятно, для обновления достаточно для вашего случая:)
Если ваш браузер поддерживает это.
function pullWorkoutTableData(workoutName){
var exerciseList = [];
return db.collection('workouts').get().then((snapshot)=>{
snapshot.docs.forEach(doc => {
if(doc.data().name === workoutName && doc.data().user.includes(user)){
doc.data().exercises.forEach(element =>{
var exercise = [element.name, element.weight, element.reps];
exerciseList.push(exercise);
});
};
});
return Promise.resolve({ exerciseList })
});
};
$(document).ready(async function(){
//This ('click','li') binds all dynamically added shit to respond to click.
$('ul.hiddentext').on('click','li', function(e){
$(this).siblings().css('font-weight','normal');
$(this).css('font-weight','bolder');
let text = $(this).text();
currentWorkoutSelected = text;
var { exerciseList: exercises } = await pullWorkoutTableData(text)
console.log(exercises.length);
var workout = new workoutTemplate(text, user, exercises);
workout.populateTable();
//Populate the title of the workout based on if its already there or not.
if($('h4#workoutTitle').length == 0){
$("table.exerciseList").prepend('<h4 id="workoutTitle">'+ text+ '</h4>');
}
else{
$('h4#workoutTitle').replaceWith('<h4 id="workoutTitle">'+ text+ '</h4>');
};
});
});