this.emit(':ask')不起作用

时间:2018-07-06 21:10:01

标签: alexa-skills-kit alexa-skill alexa-slot

我创建了一个关于Amazon技能的Intent SampleIntent,它提示用户输入城市名称。输入后,我必须保存该城市名称,然后它将再次提示/询问用户“您是否要继续?”如果用户输入是,它将再次提示输入城市名称,如果用户输入否,则退出。

为此,我在Sample Intent中创建了两个插槽。我的讲话是{slotA}和{slotB}。当我访问SampleIntent时,它会提示您输入ener City名称,但在控制台上却无法定义。它也永远不会到达继续与否的提示。

下面是我的示例模型:

{
            "name": "SampleIntent",
            "slots": [
                {
                    "name": "cityName",
                    "type": "cityName"
                },
                {
                    "name": "confirmForMore",
                    "type": "confirmForMore"
                }
            ],
            "samples": [
                "{fName} ",
                "{confirmForMore}",
                "CityName"
            ]
        }

node.js中的代码在下面

this.emit(':ask', 'Please provide City Name');
cityName = intent.slots.cityName.value;
console.log('cityName :' + cityName );

this.emit(':ask', 'Do u like details for other City?');
confirmForMore = intent.slots.confirmForMore.value;
console.log("confirmForMore : "+confirmForMore);

第4至6行永远不会执行,并且每次询问城市名称。如果输入城市名称,则无法在控制台中看到cityName。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是您的 Alexa和Lambda函数的工作方式

  1. 首先,您需要对lambda函数进行说明:“您居住在哪个城市?”
  2. 然后,Alexa根据您在上一步中提供的输入以及调用的意图为您的lambda函数创建 JSON输入
  3. Lambda函数返回一些 JSON输出,该输出适用于Alexa,并包含变量speechOutput等,并将其发送回Alexa。
  4. 现在Alexa会说出lambda函数返回的输出。

您的技能正在发生的事情是,当您要求提供插槽信息cityName时,它可以很好地工作并要求提供插槽信息,并且可能也能为您提供正确的信息。但是现在发生的是,在您的情况下,用户提供了诸如“ YES” “ NO” 之类的语音,并且lambda函数从顶部开始执行。导致再次执行此块。

this.emit(':ask', 'Please provide City Name');
cityName = intent.slots.cityName.value;
console.log('cityName :' + cityName );

为避免这种情况,您可以执行以下操作:

if (cityName in intent.slots && intent.slots.cityName.value <= 0){
    this.emit(':ask', 'Please provide City Name');
    cityName = intent.slots.cityName.value;
    console.log('cityName :' + cityName );
}
else {
    this.emit(':ask', 'Do u like details for other City?');
    confirmForMore = intent.slots.confirmForMore.value;
    console.log("confirmForMore : "+confirmForMore);
}