【问题标题】:NodeJS: Assigning to variable data retrieved asynchronously in FirebaseNodeJS:分配给在 Firebase 中异步检索的变量数据
【发布时间】:2018-05-03 16:50:30
【问题描述】:

我正在为 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 很陌生。

【问题讨论】:

    标签: node.js firebase firebase-realtime-database


    【解决方案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>
          }
        }
    }
    

    【讨论】:

    • 是的!如此简单,但我就是无法理解。谢谢。
    猜你喜欢
    • 2023-03-31
    • 2017-01-11
    • 2020-10-05
    • 2016-02-16
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多