Return 来自 helperClass.js 的价值没有回到 index.js
Return value from helperClass.js not making it back to index.js
前言: 我是 JavaScript 的新手。如果这个问题非常愚蠢,那是(部分)原因。
开始更新
我在标记为骗子之前找到了问题的答案。我用 try-catch
块解决了它。此答案未引用 try-catch
块。
How do I return the response from an asynchronous call?
结束更新
我正在尝试从头开始创建一个 Alexa 项目(好吧,至少没有亚马逊的模板之一)。我已经编写了应用程序的 "guts",并使用 chai
测试了我的功能。事情进展顺利,直到我试图建立一些意图。
我可以看到我的意图是根据我在 helperClass
中抛出的 console.log
语句发送的,但是 return 值没有返回到我的 index.js
文件.
两个问题:
- 我在搞什么鬼?
- 我该如何解决?
这是我所做的:
基于此,我四处查看 index.js
文件的 headers 中发生了什么,我看到了这个:
var Alexa = require('alexa-app');
所以我去了 alexa-app
并看到它使用 bluebird
,这表明我正在处理 promise
问题。此外,当我发送一个有效的请求时,我在日志中看到了这个:
preRequest fired
postRequest fired
当一个请求不工作时,我只看到:
preRequest fired
我正在使用 Big Nerd Ranch 的 "Developing Alexa Skills Locally with Node.js"。
这是我的 index.js
文件中的问题 intent
:
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
。我想我遇到了 return 问题。这是我的 helperClass.js
中的函数,它的 return 没有返回到 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");
}
};
感谢您的阅读。我欢迎你的建议。
原来 return 不是从 helperClass
发送的方式。问题是最初是如何调用的。
对于helperClass
,我还原为原来的return。
// This is the return from `helperClass`
return daysFromNow;
在 index.js
class 中,我将对 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;
}
}
);
希望如果 运行 遇到同样的问题,有人会觉得这很有帮助。
前言: 我是 JavaScript 的新手。如果这个问题非常愚蠢,那是(部分)原因。
开始更新
我在标记为骗子之前找到了问题的答案。我用 try-catch
块解决了它。此答案未引用 try-catch
块。
How do I return the response from an asynchronous call?
结束更新
我正在尝试从头开始创建一个 Alexa 项目(好吧,至少没有亚马逊的模板之一)。我已经编写了应用程序的 "guts",并使用 chai
测试了我的功能。事情进展顺利,直到我试图建立一些意图。
我可以看到我的意图是根据我在 helperClass
中抛出的 console.log
语句发送的,但是 return 值没有返回到我的 index.js
文件.
两个问题:
- 我在搞什么鬼?
- 我该如何解决?
这是我所做的:
基于此,我四处查看 index.js
文件的 headers 中发生了什么,我看到了这个:
var Alexa = require('alexa-app');
所以我去了 alexa-app
并看到它使用 bluebird
,这表明我正在处理 promise
问题。此外,当我发送一个有效的请求时,我在日志中看到了这个:
preRequest fired
postRequest fired
当一个请求不工作时,我只看到:
preRequest fired
我正在使用 Big Nerd Ranch 的 "Developing Alexa Skills Locally with Node.js"。
这是我的 index.js
文件中的问题 intent
:
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
。我想我遇到了 return 问题。这是我的 helperClass.js
中的函数,它的 return 没有返回到 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");
}
};
感谢您的阅读。我欢迎你的建议。
原来 return 不是从 helperClass
发送的方式。问题是最初是如何调用的。
对于helperClass
,我还原为原来的return。
// This is the return from `helperClass`
return daysFromNow;
在 index.js
class 中,我将对 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;
}
}
);
希望如果 运行 遇到同样的问题,有人会觉得这很有帮助。