Возвращаемое значение из helperClass.js, не возвращая его в index.js
Предисловие: я новичок в JavaScript. Если этот вопрос поразительно глуп, это (часть) причина.
Начать обновление
Я нашел ответ на свой вопрос до флага как обман. Я решил это с try-catch
блок. Этот ответ не ссылается на try-catch
блок.
Как мне вернуть ответ от асинхронного вызова?
Конец обновления
Я пытаюсь создать проект Alexa с нуля (ну, по крайней мере, без одного из шаблонов Amazon). Я написал "кишки" приложения и проверил свои функции с chai
, Все шло гладко, пока я не попытался связать некоторые намерения.
Я вижу, что мои намерения отправляются на основе console.log
заявления, которые я бросил в helperClass
, но возвращаемые значения не возвращаются к моему index.js
файл.
Два вопроса:
- Что я испортил?
- Как мне это исправить?
Вот что я сделал: основываясь на этом, я покопался, чтобы посмотреть, что происходит в моей 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;
}
}
);
Надеюсь, кто-то найдет это полезным, если они столкнутся с той же проблемой.