为什么在使用 API 时 conv.add 不起作用而 console.log 起作用

Why doesn't conv.add work when console.log does when using an API

//编辑:已解决。下面的代码显示了我更改后的代码,现在可以使用了。

当我使用 agent.add 时不显示任何内容,而 console.log 显示任何内容。

const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
const axios = require('axios').default;
const app = conversation();

var titels = [];

axios.get(`YOUR-API`)
  .then((result)=> {
    titels.push(result.data.categories[0].news[0].title);
    /* result.data.map(wordObj => {
      titels.push(wordObj.categories.news.title);
    });*/ 
  }); 
  
app.handle('rhymeHandler', conv => {
  console.log(titels[0]);
  conv.add(titels[0]); 
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);    

/* for (i = 1; i < 4; i++) {
  conv.add(words[i]);
  } */
  //console.log(words);

有没有人知道为什么这不起作用? 如有任何帮助,我们将不胜感激!

原因似乎是您正在使用一个承诺,但没有将该承诺提供给意图处理程序,因此它不理解它是异步的,因此 conv 是同步 returned .

您代码中的操作顺序是:

  • axios.get
    • result得到
    • 遍历result
      • 对数迭代
    • addWords
  • 退出流程执行

您不需要将承诺分配给变量,而是可以 return 直接在意图处理程序的范围内。此外,您的承诺 returns 但实际上并未解决。

以下是我将如何编写它以更好地管理异步行为:

app.handle('rhymeHandler', conv => {
  return new Promise((res, rej) => {
    axios.get(`https://api.datamuse.com/words?rel_rhy=book`)
      .then((result)=> {
        result.data.map(wordObj => {
          console.log(wordObj.word);
          words = [...words, wordObj.word];
        });
        addWords(conv);
        res(); // End promise
      });
  });
});

此外,如果您使用的是 Node 8,则可以使用 async/await 关键字来简化此 Intent 处理程序。

app.handle('rhymeHandler', async conv => {
  const result = await axios.get(`https://api.datamuse.com/words?rel_rhy=book`)
  result.data.map(wordObj => {
    console.log(wordObj.word);
    words = [...words, wordObj.word];
  });
  addWords(conv);
});

您的异步函数中似乎没有出现该问题。 Nick 发送的代码应该可以工作。所以我认为这与其他事情有关。错误消息告诉我定义了 2 个以上的简单响应,Google 上的操作无法处理。

我可以看到您在此函数中创建了一个包含多个单词的数组,并且您正在使用 conv.add(word) 生成新的简单响应。因此,如果此数组中的单词数大于 2,则响应无效。

所以为了解决这个问题。您应该确保 conv.add(word) 不会被调用超过 2 次。

希望对您有所帮助!