Alexa SDK + NodeJS: цепочка обещаний - PullRequest
0 голосов
/ 24 мая 2018

Я использую лямбда-функцию AWS с NodeJS для моего навыка alexa.Но я застрял в использовании асинхронной функции.

Вот требование

  1. При запуске асинхронная функция function1 вызывается
  2. . После завершения function1 результат передается в асинхронный режим.function2.
  3. Результат function2 должен быть передан пользователю

Так что я пытаюсь решить эту проблему, используя Promise цепочку.Ниже мой псевдокод

function function1() {
    return new Promise((resolve, reject) => {
        //some async operation
        if (result1) {
            resolve(result1);
        } else {
            reject(error);
        }
    });
}

function function2(result1) {
    return new Promise((resolve, reject) => {
        //some async operation
        if (result2) {
            resolve(result2);
        } else {
            reject(error);
        }
    });
}

const mainHandler = {
    'LaunchRequest': function () {
        function1()
            .then(result1 => function2(result1))
            .then(result2 => {
                //succcess
                this.response.cardRenderer(result2);
                this.response.speak(result2);
                this.response.listen(config.HELP_REPROMPT);
                this.emit(':responseReady');
            }).catch(err => {
                //error
                this.response.cardRenderer(err);
                this.response.speak(err);
                this.response.listen(config.HELP_REPROMPT);
                this.emit(':responseReady');
            });
    },
};

Теперь проблема, с которой я сталкиваюсь, заключается в том, что alexa преждевременно завершает свою работу после выполнения первой функции, не ожидая выполнения функции function2.Не уверен, что я здесь делаю не так.Любая помощь будет оценена.Заранее спасибо.

Примечание: Если есть только одна асинхронная функция, то она работает нормально.т.е. код ниже работает нормально.

const mainHandler = {
    'LaunchRequest': function () {
        function1()
            .then(result1 => {
                //succcess
                this.response.cardRenderer(result1);
                this.response.speak(result1);
                this.response.listen(config.HELP_REPROMPT);
                this.emit(':responseReady'); 
            })
            .catch(err => {
                //error
                this.response.cardRenderer(err);
                this.response.speak(err);
                this.response.listen(config.HELP_REPROMPT);
                this.emit(':responseReady');
            });
    },
};'

Проблема, когда задействованы 2 асинхронные функции

1 Ответ

0 голосов
/ 27 декабря 2018

Посмотрите, поможет ли это:

function function1() {
    return new Promise((resolve, reject) => {
        //some async operation
        if (result1) {
            resolve(result1);
        } else {
            reject(error);
        }
    });
}

function function2(result1) {
    return new Promise((resolve, reject) => {
        //some async operation
        if (result2) {
            resolve(result2);
        } else {
            reject(error);
        }
    });
}

const ErrorHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'LaunchRequest';
  },
  async handle(handlerInput, error) {
    result1 = await function1();
    result2 = await function2(result1);
    /* rest of code according to version2 */
        },
    };

Для разницы sdk v1 и v2 нажмите здесь .

...