为什么在使用 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 次。
希望对您有所帮助!
//编辑:已解决。下面的代码显示了我更改后的代码,现在可以使用了。
当我使用 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 次。
希望对您有所帮助!