首页 > 解决方案 > 如何缩短此功能的使用时间?Alexa/NodeJs

问题描述

我有这个函数用来返回一个槽值。如果槽是同义词,它会将同义词修改为规范槽值。这是我现在拥有的代码:

var slotHelper = function() { };

slotHelper.prototype.slotValue = (slot, useId) => {
    let value = slot.value;
    let resolution = (
        slot.resolutions
        && slot.resolutions.resolutionsPerAuthority
        && slot.resolutions.resolutionsPerAuthority.length > 0
    )
        ? slot.resolutions.resolutionsPerAuthority[0]
        : null;
    if (resolution && resolution.status.code == 'ER_SUCCESS_MATCH') {
        let resolutionValue = resolution.values[0].value;
        value = resolutionValue.id && useId
            ? resolutionValue.id
            : resolutionValue.name;
    }
    return value;
};

//Example
//let category = slotValue(handlerInput.requestEnvelope.request.intent.slots.category, true);

module.exports = new slotHelper();

我正在尝试将 //example 缩短到我可以输入以下内容的位置:

let category = slotHelper.slotValue(category);

并返回规范槽值。

我尝试了一些不同的方法,它们都导致:“错误处理:未定义类别”

以下是我尝试的不同方法:

var slotHelper = function() { };

slotHelper.prototype.slotValue = (slotName, useId) => {
    let slot = handlerInput.requestEnvelope.request.intent.slots[slotName];
    let value = slot.value;
    let resolution = (
        slot.resolutions
        && slot.resolutions.resolutionsPerAuthority
        && slot.resolutions.resolutionsPerAuthority.length > 0
    )
        ? slot.resolutions.resolutionsPerAuthority[0]
        : null;
    if (resolution && resolution.status.code == 'ER_SUCCESS_MATCH') {
        let resolutionValue = resolution.values[0].value;
        value = resolutionValue.id && useId
            ? resolutionValue.id
            : resolutionValue.name;
    }
    return value;
}

module.exports = new slotHelper();

var slotHelper = function() { };

slotHelper.prototype.slotValue = (slotName, useId) => {
    let slot = handlerInput.requestEnvelope.request.intent.slots.slotName;
    let value = slot.value;
    let resolution = (
        slot.resolutions
        && slot.resolutions.resolutionsPerAuthority
        && slot.resolutions.resolutionsPerAuthority.length > 0
    )
        ? slot.resolutions.resolutionsPerAuthority[0]
        : null;
    if (resolution && resolution.status.code == 'ER_SUCCESS_MATCH') {
        let resolutionValue = resolution.values[0].value;
        value = resolutionValue.id && useId
            ? resolutionValue.id
            : resolutionValue.name;
    }
    return value;
}

module.exports = new slotHelper();

当然,第二个 slotName 是灰色的,因为这不是正确的方法。有谁知道如何将其修改为可以使用的位置:

let category = slotHelper.slotValue(category);

我正在尝试概括此功能,以便将来可以将其用于所有插槽。这将使在我的代码中更容易使用......而不是总是必须放置:

let category = slotHelper.slotValue(handlerInput.requestEnvelope.request.intent.slots.category);

标签: javascriptnode.jsalexaalexa-skillalexa-slot

解决方案


一个可能有助于消除通过检查您的resolutionsPerAuthority数组是否存在而引入的大量样板的建议可能是使用lodash 的head方法:


const resolution = _.head(slot.resolutions.resolutionsPerAuthority);

_.head可以处理 null 或空数组输入,因此这应该有助于减少函数的大量认知开销。


推荐阅读