1

我在 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 调用会发送一个数组作为响应。我试图一一说出每个名字。但是将最接近的名称变量传递给 speak() 函数会导致“请求技能的响应存在问题”。我该如何解决这个问题?

谢谢

4

2 回答 2

1

您可以尝试使用下面的代码发送多个响应,它会调用 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();
  }
};
于 2019-02-24T16:56:12.640 回答
0

出现问题时,Alexa 的响应对开发人员不友好,是吗?

此错误可能是由方法引发的异常引起的getNearestNames(添加.catch(e => console.log(e))并检查 CloudWatch 输出,或者由于响应时间过长 - 您只有 10 秒的时间来响应用户的输入,或者您只是没有将处理程序的方法标记为async. 另外我不确定 Alexa<speak>是否使用标记包装响应文本 - 您<break>在示例中使用。

于 2019-02-26T18:50:27.163 回答