2016-04-22 46 views
1

前言:我是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文件。

兩個問題:

  1. 我是什麼打亂?
  2. 我該如何解決?

這是我做了什麼: 此基礎上,我周圍挖,看看發生了什麼事情在我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"); 
    } 
}; 

謝謝您的閱讀。我歡迎你的建議。

+1

可能重複[如何返回來自異步調用的響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-打電話) – rohithpr

+0

@rohithpr我回答了我自己的問題。 – Adrian

回答

-2

事實證明,這不是從helperClass發送回報的方式。問題在於如何打電話。

對於helperClass,我恢復到原來的退貨。

// This is the return from `helperClass` 
    return daysFromNow; 

index.js類,我把電話給helperClasstry-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; 
    } 
    } 
); 

希望有人認爲這很有幫助。