首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从helperClass.js返回的值没有返回到index.js

从helperClass.js返回的值没有返回到index.js
EN

Stack Overflow用户
提问于 2016-04-22 04:13:15
回答 1查看 97关注 0票数 1

前言:,我是JavaScript的新手。如果这个问题令人吃惊地愚蠢,那就是原因之一。

开始更新

我发现在国旗出现之前我的问题的答案是假的。我用try-catch块解决了这个问题。此答案不引用try-catch块。

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

端更新

我正试图从头开始创建一个Alexa项目(至少没有亚马逊的一个模板)。我写了这个应用程序的“内脏”,我用chai测试了我的功能。事情进展得很顺利,直到我想弄清楚一些意图。

我可以看到我的意图是基于我在helperClass中抛出的helperClass语句发送的,但是返回值并没有返回到我的index.js文件中。

两个问题:

  1. 我搞砸了什么?
  2. 我该怎么解决呢?

这里是我所做的:基于此,我仔细研究了一下我的index.js文件头中发生了什么,我看到了以下内容:

代码语言:javascript
复制
var Alexa = require('alexa-app');

所以我去了alexa-app,看到它使用了bluebird,这对我来说意味着我在处理promise问题。此外,当我发送一个有效的请求时,我在日志中看到了这一点:

代码语言:javascript
复制
preRequest fired
postRequest fired

当请求不起作用时,我只看到:

代码语言:javascript
复制
preRequest fired

我用的是大尼尔德牧场的用Node.js在本地开发Alexa技能

下面是我的intent文件中有问题的index.js

代码语言:javascript
复制
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

代码语言:javascript
复制
    // 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");
    }
};

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 02:09:53

事实证明,这不是从helperClass发送返回的方式。问题是这个电话最初是如何发出的。

对于helperClass,我返回到原来的返回。

代码语言:javascript
复制
    // This is the return from `helperClass`
    return daysFromNow;

index.js类中,我将对helperClass的调用放在try-catch块中,如下所示:

代码语言:javascript
复制
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;
    }
  }
);

希望有人发现,如果他们遇到同样的问题,这是有帮助的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36784690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档