Alexa Skill:如何循环播放一系列声音文件

时间:2018-06-16 20:17:03

标签: arrays node.js loops for-loop alexa

我有一项在亚马逊Alexa上播放动物声音的技能。

用户:狗的声音是什么样的? Alexa :(树皮) 网友:猫听起来像什么? Alexa :(喵)

等...等

我正在尝试添加一个按顺序循环遍历数组的intent,并播放我在数组中可用的所有动物声音文件:

var animalNoises = {

        'bear' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_bear_roar_small_01.mp3'/>"
        },

        'bird' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_bird_forest_01.mp3'/>"
        },

        'cat' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_cat_meow_1x_02.mp3'/>"
        },

        'cow' : {
            'noise' : "<audio src='https://s3.amazonaws.com/animalhouse-noises/animal+house+(cow-moo).mp3'/>"
        },

        'chicken' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_chicken_cluck_01.mp3'/>"
        },

        'dog' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_dog_med_bark_2x_02.mp3'/>"
        },

        'elephant' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_elephant_01.mp3'/>"
        },

        'horse' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_horse_whinny_01.mp3'/>"
        },

        'lion' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_lion_roar_02.mp3'/>"
        },

        'pig' : {
            'noise' : "<audio src='https://s3.amazonaws.com/animalhouse-noises/animal+house+(pig-snort).mp3'/>"
        },

        'monkey' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_monkey_chimp_01.mp3'/>"
        },

        'rat' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_rat_squeak_2x_01.mp3'/>"
        },

        'raven' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_raven_caw_2x_01.mp3'/>"
        },

        'rooster' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_rooster_crow_02.mp3'/>"
        },

        'sheep' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_sheep_bleat_02.mp3'/>"
        },

        'turkey' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_turkey_gobbling_01.mp3'/>"
        },

        'wolf' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_wolf_howl_02.mp3'/>"
        }

        };

这是我在意图中的代码,但没有任何运气声音文件:

 'PlayAllAnimalsIntent' : function () {
    speechOutput = '';

    for (var i = 0; i < animalNoises.length; i++) {
        var animalSounds = animalNoises[animalNoises[i]]['noise'];
        speechOutput = animalSounds;
        this.emit(":tell", speechOutput);

    }
},

1 个答案:

答案 0 :(得分:0)

问题

animalNoises.lengthundefined,因为animalNoises没有密钥length。因此i < animalNoises.length变为i < undfeined。由于i首先获得0的值,因此我们得到0 < undefined

由于javascript的类型强制噱头,0 < undefined的计算结果为false,循环内的代码块永远不会被执行。

此外,var animalSounds = animalNoises[animalNoises[i]]['noise'];会导致TypeError,因为animalNoises[animalNoises[i]]undefined,但我们永远不会那么远。

修复

要遍历对象,您需要对象的可迭代表示。 Object.keys(object)会将对象的所有键都作为数组返回。

Object.keys(animalSounds).forEach(key => {
  const sound = animalSounds[key]['noise'];
  /* Append sound to speechOutput here */
})

this.emit(":tell", speechOutput);