NodeJS: назначение переменных данных, полученных асинхронно в Firebase - PullRequest
0 голосов
/ 03 мая 2018

Я разрабатываю простой бэкэнд 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.

1 Ответ

0 голосов
/ 03 мая 2018

Насколько я вижу, вы собираетесь это сделать:

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>
      }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...