Dialogflow agent.add 无法使用 promise
Dialogflow agent.add not working with promise
我正在尝试 return 电子表格中的数据,代码工作正常,数据出现在日志中,但 agent.add
没有像预期的那样工作。
我需要使对话流响应并return我从电子表格中获得的数据。
发生的事情是,在代码的一个位置,对话流 agent.add
按预期工作,但它不是 return 我从电子表格中获取的数据,请参阅这部分:
agent.add("status code inside: "+ myCode); // agent.add working, but
myCode variable not showing the data which returned from spreadsheet, it only shows the original value "XmXm"
在代码的另一个位置,agent.add
不工作,即使我可以在日志中看到电子表格数据,(我在 agent.add
之前尝试使用和不使用 return
)看这部分
return agent.add("status code outside:"+ value); // function
agent.add whether or not I add return before it
请注意,我尝试了Whosebug中提供的许多解决方案,但我仍然无法修复它,下面是我的完整代码:
function sheetPromiseHandelerGet(orderNum){
const jwtClient = authSheet();
let getSheetPromise = new Promise((resolve, reject) => {
const mySpreadSheetId = 'SHEET_ID';
const sheetName = "SHEET_NAME";
let myCode = "XmXm"; // give myCode a string value for testing
let testFirst = 0;
sheets.spreadsheets.values.get(
{
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
},
(err, res) => {
if (err) {
console.error(err);
return;
}
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
}
}
);
agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not is "XmXm"
});
return getSheetPromise.then(function(value) {
console.log(value); // the value (which is the result comes from spreadsheet) appears correctly in the debugger,
return agent.add("status code outside:" value); // function agent.add whether or not I add return before it
});
}
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum);
}
function authSheet(){
//
}
非常感谢您的帮助!
尝试 return agent.add("status code outside:"+value);
我认为缺少“+”。
- 您想使用从
sheets.spreadsheets.values.get()
在 agent.add("status code inside: " + myCode);
的电子表格中检索到的 myCode
。
- 您想使用带有 Node.js 的 googleapis 来实现此目的。
- 您已经能够获取 Google 电子表格和表格 API 的值。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案中的一个。
修改点:
sheets.spreadsheets.values.get()
适用于异步进程。这样,在您的脚本中,agent.add("status code inside: "+ myCode);
的 myCode
始终是初始值(在您的情况下,它是 XmXm
。)。
- 在您的脚本中,
sheets.spreadsheets.values.get
是 new Promise()
中的 运行。所以 value
of getSheetPromise.then(function(value) {})
是检索到的值。
模式 1:
修改后的脚本:
如果你想在你的脚本中使用new Promise
中的agent.add("status code inside: "+ myCode);
,下面的修改怎么样?
从:
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
到:
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
agent.add("status code inside: "+ myCode);
resolve(myCode);
}
模式二:
修改后的脚本:
作为其他模式,下面的修改怎么样?在这种情况下,请按如下方式修改脚本中的getSheetPromise
。
let getSheetPromise = new Promise(async (resolve, reject) => {
const mySpreadSheetId = "SHEET_ID";
const sheetName = "SHEET_NAME";
let myCode = "XmXm";
// let testFirst = 0; // It seems that this is not used.
const res = await sheets.spreadsheets.values.get({
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
});
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]) {
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
// break; // When there are several same values of `orderNum` in the column "A", please use this line.
}
}
agent.add("status code inside: " + myCode);
});
- 这种情况下,比如"A"列中有多个相同的
orderNum
值时,agent.add("status code inside: " + myCode)
的myCode
就是最后一个的值同一行,而 resolve(myCode)
的 myCode
是第一行。如果你想要第一个,请删除 //
of // break;
.
终于在多次尝试后找到了答案,很简单,我想我需要在调用主函数 sheetPromiseHandelerGet(detailsNum)
之前添加 return
调用 sheetPromiseHandelerGet(orderNum)
, 仅此而已
因此,如果您在问题中查看我的代码结尾,而不是
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum); //return is missing
}
必须是
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
return sheetPromiseHandelerGet(detailsNum); //return has been added
}
除此之外,最好进行其他更改:
resolve(myCode);
成为
resolve(agent.add(myCode));
希望能帮到遇到同样问题的人
我正在尝试 return 电子表格中的数据,代码工作正常,数据出现在日志中,但 agent.add
没有像预期的那样工作。
我需要使对话流响应并return我从电子表格中获得的数据。
发生的事情是,在代码的一个位置,对话流 agent.add
按预期工作,但它不是 return 我从电子表格中获取的数据,请参阅这部分:
agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not showing the data which returned from spreadsheet, it only shows the original value "XmXm"
在代码的另一个位置,agent.add
不工作,即使我可以在日志中看到电子表格数据,(我在 agent.add
之前尝试使用和不使用 return
)看这部分
return agent.add("status code outside:"+ value); // function agent.add whether or not I add return before it
请注意,我尝试了Whosebug中提供的许多解决方案,但我仍然无法修复它,下面是我的完整代码:
function sheetPromiseHandelerGet(orderNum){
const jwtClient = authSheet();
let getSheetPromise = new Promise((resolve, reject) => {
const mySpreadSheetId = 'SHEET_ID';
const sheetName = "SHEET_NAME";
let myCode = "XmXm"; // give myCode a string value for testing
let testFirst = 0;
sheets.spreadsheets.values.get(
{
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
},
(err, res) => {
if (err) {
console.error(err);
return;
}
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
}
}
);
agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not is "XmXm"
});
return getSheetPromise.then(function(value) {
console.log(value); // the value (which is the result comes from spreadsheet) appears correctly in the debugger,
return agent.add("status code outside:" value); // function agent.add whether or not I add return before it
});
}
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum);
}
function authSheet(){
//
}
非常感谢您的帮助!
尝试 return agent.add("status code outside:"+value);
我认为缺少“+”。
- 您想使用从
sheets.spreadsheets.values.get()
在agent.add("status code inside: " + myCode);
的电子表格中检索到的myCode
。 - 您想使用带有 Node.js 的 googleapis 来实现此目的。
- 您已经能够获取 Google 电子表格和表格 API 的值。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案中的一个。
修改点:
sheets.spreadsheets.values.get()
适用于异步进程。这样,在您的脚本中,agent.add("status code inside: "+ myCode);
的myCode
始终是初始值(在您的情况下,它是XmXm
。)。- 在您的脚本中,
sheets.spreadsheets.values.get
是new Promise()
中的 运行。所以value
ofgetSheetPromise.then(function(value) {})
是检索到的值。
模式 1:
修改后的脚本:
如果你想在你的脚本中使用new Promise
中的agent.add("status code inside: "+ myCode);
,下面的修改怎么样?
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
}
到:
if (orderNum == data[i][0]){
myCode = `myCode: Order details: ${data[i][1]}`;
agent.add("status code inside: "+ myCode);
resolve(myCode);
}
模式二:
修改后的脚本:
作为其他模式,下面的修改怎么样?在这种情况下,请按如下方式修改脚本中的getSheetPromise
。
let getSheetPromise = new Promise(async (resolve, reject) => {
const mySpreadSheetId = "SHEET_ID";
const sheetName = "SHEET_NAME";
let myCode = "XmXm";
// let testFirst = 0; // It seems that this is not used.
const res = await sheets.spreadsheets.values.get({
auth: jwtClient,
spreadsheetId: mySpreadSheetId,
range: `${sheetName}!A:H`
});
const data = res.data.values;
let i = 0;
for (i = 0; i < data.length; i++) {
if (orderNum == data[i][0]) {
myCode = `myCode: Order details: ${data[i][1]}`;
resolve(myCode);
// break; // When there are several same values of `orderNum` in the column "A", please use this line.
}
}
agent.add("status code inside: " + myCode);
});
- 这种情况下,比如"A"列中有多个相同的
orderNum
值时,agent.add("status code inside: " + myCode)
的myCode
就是最后一个的值同一行,而resolve(myCode)
的myCode
是第一行。如果你想要第一个,请删除//
of// break;
.
终于在多次尝试后找到了答案,很简单,我想我需要在调用主函数 sheetPromiseHandelerGet(detailsNum)
之前添加 return
调用 sheetPromiseHandelerGet(orderNum)
, 仅此而已
因此,如果您在问题中查看我的代码结尾,而不是
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum); //return is missing
}
必须是
function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
return sheetPromiseHandelerGet(detailsNum); //return has been added
}
除此之外,最好进行其他更改:
resolve(myCode);
成为
resolve(agent.add(myCode));
希望能帮到遇到同样问题的人