我正在为Dialogflow聊天机器人开发一个简单的Firebase后端。该应用程序与几个数据库交互并从中检索数据。我的代码看起来像这样:
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的新手。
答案 0 :(得分:1)
据我所见,您正在寻找:
function function_A(assistant) {
let key_a = assistant.getArgument(KEY_A_NAME);
retrieve_from_database(database_a, key_a, PROPERTY_A_NAME).then(function(property) {
if (property == null) {
assistant.tell('Error Message');
}
else {
<do something with property>
}
}
}