Этот вопрос может показаться основным, но я застрял на этом. У меня есть класс, который не является компонентом, я использовал его для инициализации БД и выполнения операций БД CRUD. В классе есть метод readMatrix, который читает словарь из БД и возвращает его в виде матрицы. Я могу проверить значение матрицы в консоли, и оно правильное. Однако значение, возвращаемое вызывающей функции, является «неопределенным» вместо того, что я вижу в журнале консоли. Я попытался исправить это с помощью Redux/Hooks и нашел это слишком сложным для новичка вроде меня (я использую функции/хуки как компоненты, но класс для управления БД).
Вот код класса:
readMatrix (r,c,id) {
const row = new Array(c).fill(null);
var tempMatrix=[];
for (let i=0; i<r; i++){
tempMatrix.push([...row])
}
var restaurantRef = app.database().ref("/restaurants");
restaurantRef.orderByKey().equalTo("1").on("child_added", function(snapshot){
// console.info(snapshot.child("/layout").val());
var restaurant=snapshot.child("/layout").val();
for (const [key, value] of Object.entries(restaurant)) {
let i=key;
for (const [rowkey, rowvalue] of Object.entries(value)){
let j=rowkey;
tempMatrix[i][j]=rowvalue;
}
}
console.info(tempMatrix);
return(tempMatrix);
});
}
И вот вызывающая функция:
useEffect(()=>{
setMatrix(FirebaseClass.readMatrix(matrixHeight,matrixWidth, 1))
console.info(matrix);
}, []);
Есть идеи, что там не так?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Спасибо за ответ(ы)
Вот единственная мысль, которая это исправила.
FirebaseClass.readMatrix(matrixHeight,matrixWidth, 1).then(setMatrix)
Надеюсь, ответ понятнее, чем вопрос.
Код внутри
readMatrixкажется асинхронным.return tempMatrixбудет выполнен до того, как кtempMatrixбудут добавлены какие-либо значения. Вместо этого вы должны вернуть обещание. Возможно Почему моя переменная остается неизменной после того, как я изменяю ее внутри функции? - Справочник по асинхронному коду помогает.