[英]Dialogflow agent.add not working with promise
我正在嘗試從電子表格返回數據,代碼工作正常,數據出現在日志中,但agent.add
沒有正常工作,正如預期的那樣。
我需要的是使對話流響應並返回我從電子表格中獲得的數據。
發生的事情是,在代碼的一個位置,dialogflow agent.add
按預期工作,但它沒有返回我從電子表格中獲取的數據,請參見這一部分:
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
請注意,我嘗試了很多在 stackoverflow 中提供的解決方案,但我仍然無法修復它,下面是我的完整代碼:
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(){ // }
我將非常感謝您的幫助!
經過多次嘗試,我終於找到了答案,這很簡單,我認為我需要在調用調用sheetPromiseHandelerGet(orderNum)
的主函數sheetPromiseHandelerGet(detailsNum)
之前添加return
,僅此而已
所以如果你在問題中查看我的代碼的結尾,而不是
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));
我希望能幫助任何有同樣問題的人
agent.add("status code inside: " + myCode);
中使用myCode
sheets.spreadsheets.values.get()
從 Spreadsheet 檢索的 myCode .如果我的理解是正確的,那么這個答案呢? 請將此視為幾個可能答案中的一個。
sheets.spreadsheets.values.get()
適用於異步過程。 這樣,在你的腳本中, myCode
of agent.add("status code inside: "+ myCode);
始終是初始值(在您的情況下,它是XmXm
。)。sheets.spreadsheets.values.get
在new Promise()
中運行。 所以 getSheetPromise.then(function( value
getSheetPromise.then(function(value) {})
的值是檢索到的值。 如果要使用agent.add("status code inside: "+ myCode);
在你的腳本中的new Promise
中,下面的修改怎么樣?
if (orderNum == data[i][0]){ myCode = `myCode: Order details: ${data[i][1]}`; resolve(myCode); }
到:
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);
});
作為其他模式,以下修改如何? 在這種情況下,請按如下方式修改腳本中的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); });
orderNum
值時, myCode
agent.add("status code inside: " + myCode)
的myCode是最后同一行的值,而resolve(myCode)
的myCode
resolve(myCode)
是第一行。 如果你想要第一個,請刪除//
of // break;
. try return agent.add("status code outside:"+value);
我認為缺少“+”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.