我在回答alexa响应中的多个选项时遇到问题。请找到以下代码:
let results = await getNearestNames(data.results[0].geometry.location.lat, data.results[0].geometry.location.lng);
// generate response
let nearestNames = "";
results.map((obj) => {
nearestNames += obj.name + '<break time="1s">';
});
response = responseBuilder
.speak(nearestNames)
.getResponse();
getNearestNames API调用发送一个数组作为响应。我试图逐一说出每个名字。但是将nearestNames变量传递给speak()函数会导致“请求技能的响应存在问题”。我该如何解决这个问题?
谢谢
您可以尝试使用以下代码发送多个响应,它会进行API调用以获取书名,迭代它并回复标题。它使用request-promise-native模块发出请求,只是为了显示示例。
async function getNames() {
try {
const options = {
method: "GET",
url: "http://libgen.io/json.php?ids=1,2&fields=Title,Author,MD5"
};
let result = await rp(options);
result = JSON.parse(result);
return result;
} catch (e) {
throw e;
}
}
const BookNameIntentHandler = {
canHandle(handlerInput) {
return (
handlerInput.requestEnvelope.request.type === "IntentRequest" &&
handlerInput.requestEnvelope.request.intent.name === "BookIntent"
);
},
async handle(handlerInput) {
const data = await getNames();
let names = "";
data.map(item => {
names += `${item.title} <break time="3s"/>`;
});
console.log("Names ", names);
const speechText = `<speak> The books names are, <break time="2s"/> ${names}</speak>`;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
};
当出现问题时,Alexa的回复不是开发人员友好的,是吗?
这个错误可能是由getNearestNames
方法引发的异常引起的(添加.catch(e => console.log(e))
并检查CloudWatch输出,或者由于响应时间太长 - 你只有10秒的时间来响应用户的输入,或者你还没有标记处理程序的作为async
的方法。另外我不确定Alexa是否用<speak>
标记包装响应文本 - 你在样本中使用<break>
。