如何在 Dialogflow 中使用 if else 循环来显示结果

How to use if else loop in Dialogflow for showing results

我有 Javascript 代码用于 Dialogflow 在 Google 操作上执行项目。对于此代码,如果答案在数据库中意味着它将回答,否则它将退出应用程序。所以,我想为这段代码使用 else 循环请帮助我

    function handleCompanyDetails(agent){   
  const RegNo = agent.parameters.RegNo;
  var ref8 =  admin.database().ref().child("Table/");
  var query8 = ref8.orderByChild("RegNo").equalTo(RegNo);
 return query8.once("value")
  .then(function(snapshot) {  
   snapshot.forEach(function(child) {

    if( !snapshot.exists() ){
      // There are no results, say so
      agent.add("There are no results for that account.");

    } else {
      // ... Do something with the data
         agent.add(`The student placed in  ` + child.val().CompanyName);
    }

  });

 });        
 }

在对快照进行操作时使用.then()。因为 .once() 只触发一次,所以如果数据可用 meaning.then() 将被执行,您可以使用 .catch() 退出它。检查下面的代码。

function handleCompanyDetails(agent){   
  const RegNo = agent.parameters.RegNo;
  var ref8 =  admin.database().ref().child("Table/");
  var query8 = ref8.orderByChild("RegNo").equalTo(RegNo);
  return query8.once("value")
     .then(function(snapshot) {  
          snapshot.forEach(function(child) {
              agent.add(`The student placed in  ` + child.val().CompanyName);
              agent.add(new Card({
                  title: ` Name:${child.val().Studentname}
                  Reg No: ${child.val().RegNo}
                  Offer Date: ${child.val().OfferDate} `, 
                  imageUrl: '',
                  text:  `Thanks for using \n  ${child.val().FirstName} `,
                  buttonText: '.com'
              })
           })
        })
     .catch( // throw some error)
    }

您可以在此处阅读更多内容,https://firebase.google.com/docs/database/web/read-and-write

虽然您可以使用循环来显示结果,但您的操作方式存在一些问题,甚至可能与您尝试的操作有关return.

首先 - Dialogflow 要求您 return 来自任何进行异步调用的函数的 Promise,例如对 Firebase 数据库的调用。您当前正在使用回调方法。您应该改为使用 once() 和 return 的 Promise,因此它可能看起来像这样:

return query8.once("value")
  .then( snapshot => {
    // working with snapshot goes here
  })
  .catch( err => {
    console.error(err);
    agent.add("There was a problem.");
  });

第二个是您如何使用 snapshot 本身。如果您期待多个结果,您应该知道您只能用短信两次和一张基本卡调用 agent.add()。如果您想要多张卡片,您可能需要使用 list 或轮播。

如果您希望只有一个响应从 RegNo 中索引,看起来您可能是这样,那么您应该将其作为路径的一部分并获取快照的值。在这种情况下你不需要循环。

更新 基于更新的代码。

正如您所指出的,如果没有结果,您将不会发送任何内容,因此 Action 会因错误而退出。

最简单的方法是使用snapshot.exists()检查快照中是否有任何结果。如果没有,那么您可以 return 报错。这可能看起来像

return query8.once("value")
  .then(function(snapshot) {  

    if( !snapshot.exists() ){
      // There are no results, say so
      agent.add("There are no results for that account.");

    } else {
      // ... Do something with the data
    }

  });
  // ...

如果您 有结果,您仍然会遇到发回太多回复的问题。除非您使用列表或轮播,否则您只能有一张 agent.add() 带有要说的消息(或最多两张,但不要那样做)和一张卡片。因此,您最好在循环内构建该消息。