Возвращает значение функции после завершения функции aasy - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь дождаться, пока функция вернет значение моей таблицы mysql, и использую это как возврат для моего const ProjektNameIntentHandler.Это мой код:

const ProjektNameIntentHandler = {
canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
        && handlerInput.requestEnvelope.request.intent.name === 'ProjektNameIntent';
},
handle(handlerInput) {

    let getProjektName = queryDb()
    getProjektName.then(function(result) {
        var projektName = result[0];
        console.log(projektName.Test);
    })
    return handlerInput.responseBuilder
        .speak(projektName.Test)
        .withSimpleCard('Venture', projektName.Test)
        .getResponse();
    }
};

Теперь проблема в том, что получите результат ProjektNameIntentHandler до того, как projektName получит результат.Во-первых, я попытался поместить второе возвращение в область действия функции.Но в этом случае результат также относится к функции, а не как возврат для моего ProjektNameIntentHandler.

. Поэтому все, что я пытаюсь сделать архивом, это то, что второе возвращение для handlerinput ждет моего getProjektName.then до конца.Как я могу это сделать?

1 Ответ

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

Как вы уже догадались, на данный момент вы возвращаете undefined, потому что асинхронная функция getProjektName еще не разрешена. Дело в том, что внутри синхронной функции вы не можете ждать для завершения функции - вы можете сделать это только в асинхронных функциях ... Однако вы можете сделать handle асинхронным! Если это соответствует вашим требованиям, вы можете изменить свой код следующим образом:

const ProjektNameIntentHandler = {
    // ...
    async handle(handlerInput) { // 'async' makes the function asynchronous
        let result = await queryDb(); // wait for the promise to resolve
        let projektName = result[0];
        console.log(projektName.Test);
        return handlerInput.responseBuilder
            .speak(projektName.Test)
            .withSimpleCard('Venture', projektName.Test)
            .getResponse();
    }
};

Я пропущу подробные объяснения того, как принять асинхронность JavaScript - уже есть подобный вопрос с качественным ответом , который именно это и делает!

...