1

前言:我是 JavaScript 新手。如果这个问题非常愚蠢,那是(部分)原因。

开始更新

我在被骗之前找到了我的问题的答案。我用try-catch块解决了它。这个答案没有引用try-catch块。

如何从异步调用返回响应?

结束更新

我正在尝试从头开始创建一个 Alexa 项目(好吧,至少没有亚马逊的模板之一)。我已经编写了应用程序的“胆量”,并使用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 的“使用 Node.js 在本地开发 Alexa 技能”

这是我intentindex.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");
    }
};

感谢您的阅读。我欢迎你的建议。

4

1 回答 1

-2

事实证明,这不是从发送返回的方式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;
    }
  }
);

希望有人遇到同样的问题时会觉得这很有帮助。

于 2016-04-23T02:09:53.367 回答