前言:我是JavaScript新手。如果這個問題非常愚蠢,那是(部分)原因。helperClass.js的返回值不會返回到index.js
開始更新
我找到了答案,我的問題的標誌作爲一個傻瓜之前。我用try-catch
塊解決了它。這個答案沒有引用try-catch
塊。
How do I return the response from an asynchronous call?
末更新
我試圖從頭開始創建一個Alexa的項目(當然,至少在沒有Amazon的模板之一)。我寫了應用程序的「膽量」,並用chai
測試了我的功能。事情正在順利進行,直到我試圖聯繫一些意圖。
我可以看到我的意圖是基於我在helperClass
中拋出的console.log
聲明發送的,但返回值沒有返回到我的index.js
文件。
兩個問題:
- 我是什麼打亂?
- 我該如何解決?
這是我做了什麼: 此基礎上,我周圍挖,看看發生了什麼事情在我index.js
文件的頭,我看到這一點:
var Alexa = require('alexa-app');
所以我去alexa-app
並看到它使用bluebird
,這表明我正在處理promise
問題。此外,我看到這個在日誌中當我發送的作品的請求:
preRequest fired
postRequest fired
當一個請求是不行的,我只看到:
preRequest fired
我用大書呆子牧場的"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
。我想我有一個回報問題。這裏的功能在我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");
}
};
謝謝您的閱讀。我歡迎你的建議。
可能重複[如何返回來自異步調用的響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打電話) – rohithpr
@rohithpr我回答了我自己的問題。 – Adrian