Я разрабатываю простой бэкэнд Firebase для чат-бота Dialogflow. Приложение взаимодействует с несколькими базами данных и извлекает из них данные. Мой код выглядел примерно так:
function_A (assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
database_a.child(key_a).once("value", snap => {
if (snap.val() == null) {
//not reachable
assistant.tell('Error Message');
}
else {
let result = snap.val()[PROPERTY_NAME]
<do_something_with result>
}
});
}
function_B (assistant) {
let key_B = assistant.getArgument(KEY_B_NAME);
database_B.child(key_B).once("value", snap => {
if (snap.val() == null) {
//not reachable
assistant.tell("ErrorMessage);
}
else {
let result = snap.val()[PROPERTY_NAME]
<do something else with result>
}
});
}
Теперь я хочу реорганизовать код и повторно использовать поиск в базе данных. Я пытался сделать что-то вроде этого:
function function_A(assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
const property = retrieve_from_database(database_a, key_a, PROPERTY_A_NAME);
if (property == null) {
//not reachable
assistant.tell('Error Message');
}
else {
<do something with property>
}
}
function retrieve_from_database(db, key, entry_name) {
const ref = db.child(key);
return ref.once("value").then(function(snap) {
if (snap.val() == null) {
return null;
}
else {
return snap.val()[entry_name];
}
});
}
Однако функция retrieve_from_database возвращает объект Promise, и, насколько я читал об Promises, я до сих пор не понимаю, как извлечь из него необходимую информацию и сохранить ее в переменной. Кажется, здесь есть нечто фундаментальное, чего я не понимаю. Я очень новичок в NodeJS и Firebase.