Методы внутри обещаний JavaScript не работают в диалоговом потоке

1

Таким образом, это код для yelp-fusion node.js API, используемый в диалоговом окне v2.

Проблема: agent.add(response.jsonBody.businesses[0].name); который должен заставить бота сказать, что имя бизнеса фактически не работает, даже несмотря на то, что код существует.

Из исследований в других ответах говорилось о необходимости использования жира arrow => в этих обещаниях javascript.

Однако он уже используется. Код внутри.then() не работает, за исключением console.log, который запускается.

Может ли кто-нибудь советовать, что я могу сделать, чтобы запускать методы внутри javascript-обещаний? Или другие альтернативы? Очень признателен. Спасибо!

клиентом ниже является клиент API yelp.

agent - это webhookclient в диалоговом потоке. agent.add() работает, когда выполняется вне этого кода ниже.

    client.search({
      term:'Four Barrel Coffee',
      location: 'san francisco, ca'
    }).then(response => {
      //res = response.jsonBody.businesses[0].name; //*not assigned!
      console.log(response.jsonBody.businesses[0].name); 
      agent.add(response.jsonBody.businesses[0].name); //*nothing!
    }).catch(e => {
      console.log(e);
    });
  • 0
    что такое agent.add? это асинхронно? Можете ли вы опубликовать некоторый контекст.
  • 0
    @AritraChakraborty Добавлена дополнительная информация о агенте - agent.add - это метод в диалоге, который просит бота что-то сказать. Работает, когда запускается вне кода выше.
Показать ещё 3 комментария
Теги:
dialogflow
yelp

1 ответ

1
Лучший ответ

У вас есть половина решения. Это не столько использование жирной стрелки, а то, что вы имеете дело с асинхронными функциями (вызов client.search), и что при использовании асинхронных функций с библиотекой выполнения диалогов необходимо использовать Promises.

В частности - вам нужно вернуть Promise, чтобы вызывающая функция узнала, что ей нужно дождаться завершения всех предложений then(), чтобы отправить ответ.

Вы не показываете всю свою функцию, но вы, вероятно, можете сделать это, добавив несколько операторов return. Возможно, что-то вроде этого:

return client.search({
  term:'Four Barrel Coffee',
  location: 'san francisco, ca'
}).then(response => {
  return agent.add(response.jsonBody.businesses[0].name);
}).catch(e => {
  console.log(e);
  return Promise.reject( e );
});
  • 0
    Я не думаю, что это проблема. Ничто в вопросе OP не предполагает, что они полагаются на возвращаемое значение client.search() .
  • 0
    Я не уверен, почему ты так говоришь @Phil. У OP есть блок then() который получает в response результат client.search() . Они используют response при вызове agent.add() . Они сказали, что console.log() работает, что говорит о том, что agent.add() не работает. agent.add() является частью библиотеки Dialogflow и возвращает результаты пользователю, но полагается на возвращение Promise, если задействованы асинхронные функции. Я не знаю client.search() , но похоже, что она асинхронная. Нет никаких доказательств того, что Promise возвращается в образце кода OP.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню