Облачная функция DialogFlow Firebase с асинхронным чтением базы данных

Я использую облачную функцию Firebase для выполнения своего действия DialogFlow Google Assistant, но мне нужно получить данные из базы данных Firebase, прежде чем я буду управлять намерением. Вот фрагмент кода:

  var userDataRef = sessionDatabaseRef.child(sessionId);
  userDataRef.once("value").then(function(data) {
    console.log(data.val());
    handleIntentAndProcessResponse();
  }).catch(function(){
    console.log("No data yet for this session");
    handleIntentAndProcessResponse();
  });

В функции, называемой handleIntentAndProcessResponse, логика намерения возвращает ответ, устанавливая материал conv.ask(new SimpleResponse(blah)). Когда я тестирую это, он терпит неудачу, и журнал облачных функций дает мне эту ошибку:

Ошибка: ответ не задан. Используется ли это в асинхронном вызове, который не был возвращен как обещание обработчику намерений?

Итак, как я могу обработать этот асинхронный вызов базы данных Firebase, чтобы он ждал ответа? Мне нужно использовать данные, которые он возвращает, когда обрабатываю намерение.


person Lee Probert    schedule 10.03.2020    source источник


Ответы (1)


Как следует из сообщения об ошибке, вам необходимо вернуть само обещание, чтобы диспетчер знал, что ему нужно дождаться завершения каждой части асинхронной операции.

К счастью, вызовы userDataRef.once().then().catch() будут оцениваться как Promise, и вы можете просто вернуть его. Так что это должно быть хорошо

  return userDataRef.once("value").then(function(data) {
    console.log(data.val());
    handleIntentAndProcessResponse();
  }).catch(function(){
    console.log("No data yet for this session");
    handleIntentAndProcessResponse();
  });
person Prisoner    schedule 10.03.2020
comment
Спасибо большое. Это сработало. Еще один вопрос: мне нужно хранить данные между сеансами, потому что я использовал для этого глобальный класс, прежде чем я понял, что облачные функции совместно используют экземпляры между вызовами, и мои данные перезаписывались другими сеансами. Нужно ли мне беспокоиться о состоянии гонки с этим классом? Могу ли я просто обновить его данными сеанса из Firebase, когда я обработаю намерение? - person Lee Probert; 11.03.2020
comment
Думаю, я прав, думая, что он не позволяет одновременно вызывать несколько экземпляров функции. - person Lee Probert; 11.03.2020
comment
Вы правы, что облачные функции могут совместно использовать экземпляры между вызовами, или вы можете получить совершенно отдельные экземпляры. Ваш лучший случай, чтобы убедиться, что вы ответили на любые вопросы, которые у вас есть по этому поводу, - это создать новый вопрос StackOverflow с точным указанием того, как вы хотите сохранить информацию о сеансе (есть несколько вопросов и ответов, которые уже обсуждают это) и где вас беспокоят, если эти другие вопросы / ответы все еще оставляют вас в неопределенности. - person Prisoner; 11.03.2020