У вас есть пара вопросов, связанных с тем, как вы используете Обещания.Обещания используются базой данных Firebase и облачными функциями Firebase для обработки асинхронных операций в node.js.В современном node.js Promises в значительной степени предпочтительнее обратных вызовов.
Первая проблема заключается в том, что вы, кажется, смешиваете обратные вызовы и Promises, когда обрабатываете ответ на вызов Firebase.Поскольку once()
может вернуть Обещание, вам не нужно использовать обратный вызов, но вы можете поместить его как часть .then()
блока.Это может выглядеть примерно так:
.once("value").then( snapshot => {
if (snapshot.val() === null) {
ref.child(uid).set({
FIRST_NAME: firstName,
LAST_NAME: lastName
});
added = true;
}
return snapshot;
})
Вторая проблема заключается в том, что все, что установлено посредством выполнения Обещания, должно быть прочитано в более поздней части цепочки Обещания.Так же, как вы устанавливаете added
в первой функции then()
и читаете ее во второй, если вы устанавливаете message
во второй, вам нужно обрабатывать это либо в этом предложении then()
, либо впозже then()
пункт.Поскольку других асинхронных операций не происходит, вы можете просто сделать это после предложения if / else.Возможно, что-то вроде этого:
if (added === true) {
message = "Great! You are now added to the database";
console.log("User_added_success");
}
else {
message = "User aldready exists!";
console.log("User_added_fail");
}
agent.add( message );
Однако есть еще одна проблема, связанная с Обещаниями.Если вы используете асинхронные вызовы (и, следовательно, Promises), вы также должны вернуть Promise из вашего Intent Handler, чтобы библиотека Dialogflow могла ожидать результатов, прежде чем отправит сообщение обратно пользователю.Не ясно, является ли это самим обработчиком, но если так, самый простой способ справиться с этим - вернуть результаты цепочки Promise.Поскольку вызов базы данных Firebase возвращает Promise, эта часть может быть простой:
return ref.child(uid)
(за которой следуют методы .once()
и .then()
, описанные выше).