Alexa скины асинхронные ждут получения данных от DynamoDB - PullRequest
1 голос
/ 16 марта 2019

Следующий код - мой обработчик запуска в моем умении Alexa, и у меня есть переменная с именем x внутри моего обработчика.Я пытаюсь установить x для данных, которые я получаю из DynamoDB, и использовать их вне функции get (я получил функцию из https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html#GettingStarted.NodeJs.03.02), чтобы Alexa могла произносить значение (строку) x (как вы видите в возврате). Оператор в моей функции «get» не меняет значение x вне самой функции get. Я знаю, что x внутри функции get фактически изменяется, потому что я записываю его вконсоль. Таким образом, я опубликовал аналогичную публикацию по этому вопросу, и сначала я подумал, что это проблема с областью видимости, но оказалось, что это потому, что функция get является асинхронной. Следовательно, я добавил ключевые слова async и await, как показано ниже. Я новичок вNodeJS, так что я решил поместить их в соответствии с тем, что я исследовал. Однако это все еще не работает.

const LaunchHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === `LaunchRequest`;
  },
  async handle(handlerInput) {
    var x;

    //DYNAMO GET FUNCTION
    await DBClient.get(params, function(err, data) {
    if (err) {
        console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
         x = data.Item.Answer;
    } }); 

    return handlerInput.responseBuilder
      .speak(x)
      .withShouldEndSession(false)
      .getResponse();
  },
};

В качестве примечания, вот JSON, который я (успешно)возвращение из базы данных:

{
    "Item": {
        "Answer": "Sunny weather",
        "Question": "What is the weather like today"
    }
}  

1 Ответ

0 голосов
/ 16 марта 2019

Вы ищете что-то подобное?В функции handle я вызываю другую функцию getSpeechOutput для создания текста обратной связи.Таким образом, функция вызывает динамическую функцию getGA для получения пользовательских данных

const getSpeechOutput = async function (version) {
  const gadata = await ga.getGA(gaQueryUsers, 'ga:users')

  let speechOutput;
  ...
  return ...
}

const UsersIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'UsersIntent';
  },
  async handle(handlerInput) {
    try {
      let speechOutput
     ...
        speechOutput = await getSpeechOutput("long");
     ...

      return handlerInput.responseBuilder
        .speak(speechOutput)
        .reprompt("Noch eine Frage?")
        .withSimpleCard(defaulttext.SKILL_NAME, speechOutput)
        .getResponse();

    } catch (error) {
      console.error(error);
    }
  },
};

То есть функция db:

const getUser = async function (userId) {
    const dynamodbParams = {
        TableName: process.env.DYNAMODB_TABLE_BLICKANALYTICS,
        Key: {
            id: userId
        }
    }
    return await dynamoDb.get(dynamodbParams).promise()
}
...