如何在 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()
带有要说的消息(或最多两张,但不要那样做)和一张卡片。因此,您最好在循环内构建该消息。
我有 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()
带有要说的消息(或最多两张,但不要那样做)和一张卡片。因此,您最好在循环内构建该消息。