簡體   English   中英

Dialogflow agent.add 不使用 promise

[英]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 .
  • 您想使用 googleapis 和 Node.js 來實現這一點。
  • 您已經能夠使用 Sheets API 獲取 Google Spreadsheet 的值。

如果我的理解是正確的,那么這個答案呢? 請將此視為幾個可能答案中的一個。

修改點:

  • sheets.spreadsheets.values.get()適用於異步過程。 這樣,在你的腳本中, myCode of agent.add("status code inside: "+ myCode); 始終是初始值(在您的情況下,它是XmXm 。)。
  • 在您的腳本中, sheets.spreadsheets.values.getnew Promise()中運行。 所以 getSheetPromise.then(function( value getSheetPromise.then(function(value) {})的值是檢索到的值。

模式 1:

修改腳本:

如果要使用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);
});

模式 2:

修改腳本:

作為其他模式,以下修改如何? 在這種情況下,請按如下方式修改腳本中的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值時, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM