Асинхронная функция в AWS Lambda Alexa Intent с API Yummly - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь получить данные из API Yummly через Amazon Alexa, используя ws-yummly в Node.js, развернутом на AWS Lambda. Я довольно новичок во всех аспектах этого, но плохо знаком с javascript в частности (Python - мой «родной» язык).

Вот что я имею для своей рекомендации:

"RecommendationIntent": function () {
        // delegate to Alexa to collect all the required slots

        let filledSlots = delegateSlotCollection.call(this);

        if (!filledSlots) {
            return;
        }

        console.log("filled slots: " + JSON.stringify(filledSlots));
        // at this point, we know that all required slots are filled.
        let slotValues = getSlotValues(filledSlots);

        console.log(JSON.stringify(slotValues));

        const mainIngredientQuery = slotValues.mainIngredient.resolved;

                async function main (queryWord) {
                    const resp = await Yummly.query(queryWord)
                        .maxTotalTimeInSeconds(1400)
                        .maxResults(20)
                        .minRating(3)
                        .get();
                    const names = resp.matches.map(recipe => recipe.recipeName);
                    const speechOutput = String(names[0]);
                        this.response.speak(speechOutput);
                        this.emit(":responseReady");
                }
                main(mainIngredientQuery).catch(error => console.error(error))
    },

Это файл index.js, развернутый в AWS lambda. Я изолировал проблему с асинхронной функцией. Я протестировал функцию локально, и она возвращает в console.log список имен рецептов. Я хочу, чтобы Алекса произнесла эти имена. Или хотя бы одно имя.

Если я помещаю назначение speechOutput внутрь (как сейчас), то я получаю сообщение об ошибке, что 'Speechlet Response установлен в null'.

Если я скажу «возвращать имена» и установлю внешнее присвоение именам или именам [0], я получу обещание объекта или неопределенное значение (соответственно).

Все остальное в моей программе работает нормально и тестирует эти два бита на части, они работают, но соединять их вместе не работает. Я думаю, что это ошибка синтаксиса или размещения, но я еще недостаточно хорошо понимаю структуру или форматирование (все еще учусь), чтобы понять, что делать дальше.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Я обновляю это в случае, если у кого-то еще есть та же самая проблема.

Если вы заметили, в моем исходном коде у меня была асинхронная функция внутри намерения. Это не сработало, потому что само намерение было / является функцией. Сделав вместо этого функцию «намерение» асинхронной, я смог решить эту проблему.

Ниже приведен рабочий код для асинхронного / ожидающего Alexa Intent.

Полный index.js доступен на моем github , если вы хотите взглянуть, но это будет более продвинутая финальная версия. Приведенный ниже код сразу следует за исходным вопросом.

"RecommendationIntent": async function main () {
    // delegate to Alexa to collect all the required slots

    let filledSlots = delegateSlotCollection.call(this);

    if (!filledSlots) {
        return;
    }

    console.log("filled slots: " + JSON.stringify(filledSlots));
    // at this point, we know that all required slots are filled.
    let slotValues = getSlotValues(filledSlots);

    console.log(JSON.stringify(slotValues));

    const mainIngredientQuery = slotValues.mainIngredient.resolved;
            const resp = await Yummly.query('chicken')
            .maxTotalTimeInSeconds(1400)
            .maxResults(20)
            .minRating(3)
            .get();
        const names = resp.matches.map(recipe => recipe.recipeName);
        console.log(names);
            const speechOutput = names[0];
            this.response.speak(speechOutput);
            this.emit(":responseReady");
},
0 голосов
/ 30 апреля 2018

Как насчет использования Promise.then, например:

async function main (queryWord) {
  const resp = await Yummly.query(queryWord)
                    .maxTotalTimeInSeconds(1400)
                    .maxResults(20)
                    .minRating(3)
                    .get();
  const names = resp.matches.map(recipe => recipe.recipeName);

  return String(names[0]);

}

main(mainIngredientQuery)
  .catch( error => console.error(error) )
  .then( data => {

    this.response.speak( data );
    this.emit(":responseReady");

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...