Возвращаемое значение из helperClass.js, не возвращая его в index.js

Предисловие: я новичок в JavaScript. Если этот вопрос поразительно глуп, это (часть) причина.

Начать обновление

Я нашел ответ на свой вопрос до флага как обман. Я решил это с try-catch блок. Этот ответ не ссылается на try-catch блок.

Как мне вернуть ответ от асинхронного вызова?

Конец обновления

Я пытаюсь создать проект Alexa с нуля (ну, по крайней мере, без одного из шаблонов Amazon). Я написал "кишки" приложения и проверил свои функции с chai, Все шло гладко, пока я не попытался связать некоторые намерения.

Я вижу, что мои намерения отправляются на основе console.log заявления, которые я бросил в helperClass, но возвращаемые значения не возвращаются к моему index.js файл.

Два вопроса:

  1. Что я испортил?
  2. Как мне это исправить?

Вот что я сделал: основываясь на этом, я покопался, чтобы посмотреть, что происходит в моей index.js Заголовки файла, и я увидел это:

var Alexa = require('alexa-app');

Итак, я пошел в alexa-app и увидел, что он использует bluebirdчто говорит мне о том, что я имею дело с promise проблема. Далее я увидел это в журнале, когда отправляю запрос, который работает:

preRequest fired
postRequest fired

Когда запрос не работает, я вижу только:

preRequest fired

Я использую Big Nerd Ranch "Развитие навыков Alexa локально с Node.js".

Вот мой проблемный intent в моем index.js файл:

app.intent('getDaysFromNow', {
  'slots': {
        'INPUTDATE' : 'AMAZON.DATE'
  },
    'utterances': ['{|number of|how many} {days} {until|from|since} {|now|today} {|is|was} {-|INPUTDATE}'] // almost perfect
},
  function(req, res) {
    console.log('app.intent getDaysFromNow fired');
    //get the slot
    var inputDate = req.slot('INPUTDATE');
    var reprompt = 'Ask me how many days until or from a specified date.';
    if (_.isEmpty(inputDate)) {
        console.console.log('app.intent daysFromNow blank request');
      var prompt = 'I didn\'t hear the date you want.';
      res.say(prompt).reprompt(reprompt).shouldEndSession(false);
      return true;
    } else {
        console.log('getDaysFromNow slot is not empty.');
      var dateHelper = new DateHelper();
      dateHelper.getDaysFromNow(inputDate).then(function(daysFromNow) { 
        console.log(daysFromNow);
        res.say(dateHelper.formatDaysFromNowResponse(daysFromNow)).send(); // FIXME
      }).catch(function(err) {
        console.log(err.statusCode);
        var prompt = 'Hmm...I don\'t have a date for that ' + inputDate;
        res.say(prompt).reprompt(reprompt).shouldEndSession(false).send();
      });
      return false;
    }
  }
);

Я знаю, что он отправляется, но ценность не возвращается index.js, Я думаю, что у меня проблема с возвратом. Вот функция в моем helperClass.js чье возвращение не возвращается index.js

    // Takes AMAZON.DATE string as its argument
DateHelper.prototype.getDaysFromNow = function(inputDate) {

    if (isValidDate(inputDate)) {       // validate it
        // if it's valid, run the function
        inputDate = moment(inputDate, "YYYY-MM-DD").startOf('day'); // inputDate starts as a string, recast as a moment here
        // create currentDate moment from current Date()
        var currentDate = moment(new Date()).startOf('day');

        // Calculate daysFromNow here
        var daysFromNow = inputDate.diff(currentDate, 'days');
        console.log("\t" + 'daysFromNow = ' + daysFromNow);

        // ORIGINAL CODE
        // return daysFromNow;

        // EXPERIMENTAL CODE
        return this.daysFromNow.then(
            function(response) {
                return response.body;
            }
        );
    } else {
        // throw an error
        throw new Error("getDaysFromNow(): argument must be valid AMAZON.DATE string");
    }
};

Спасибо за чтение. Я приветствую ваши предложения.

1 ответ

Решение

Оказывается, это не тот способ, которым возвращается helperClass, Вопрос в том, как был сделан звонок.

Для helperClassЯ вернулся к первоначальному возвращению.

    // This is the return from `helperClass`
    return daysFromNow;

в index.js класс, я позвонил helperClass в try-catch блок, вот так:

app.intent('getDaysFromNow', {
  'slots': {
    'INPUTDATE': 'AMAZON.DATE'
  },
  'utterances': ['{|number of|how many} {days} {until|from|since} {|now|today} {|is|was} {-|INPUTDATE}'] // almost perfect
},
  function(req, res) {
    console.log('app.intent getDaysFromNow fired');
    //get the slot
    var inputDate = req.slot('INPUTDATE');
    var reprompt = 'Ask me how many days until or from a specified date.';
    if (_.isEmpty(inputDate)) {
      console.log('app.intent daysFromNow blank request');
      var prompt = 'I didn\'t hear the date you want.';
      res.say(prompt).reprompt(reprompt).shouldEndSession(false);
      return true;
    } else {
      // ** CHANGED: This is the part that changed. **
      console.log('getDaysFromNow slot is not empty.');
      var dateHelper = new DateHelper();
      try {
        var daysFromNow = dateHelper.getDaysFromNow(inputDate);
        res.say(dateHelper.formatDaysFromNowResponse(daysFromNow)).send(); 
      } catch (error) {
        console.log("error", error);
        var prompt = 'Hmm...I don\'t have a date for that ' + inputDate;
        res.say(prompt).reprompt(reprompt).shouldEndSession(false).send();
      }
      return false;
    }
  }
);

Надеюсь, кто-то найдет это полезным, если они столкнутся с той же проблемой.

Другие вопросы по тегам