2016-04-22 18 views
1

はじめに: JavaScriptの新機能です。この質問が驚くほど愚かな場合、それは理由の一部です。helperClass.jsからの戻り値がindex.jsに戻らない

を更新

開始私はだまされやすい人として前にフラグの私の質問への答えを見つけました。私はtry-catchブロックで解決しました。この回答はブロックtry-catchを参照していません。

How do I return the response from an asynchronous call?

エンド更新

私はスクラッチ(まあ、少なくともAmazonのテンプレートのいずれかなし)からAlexaのプロジェクトを作成しようとしています。私はアプリの "勇気"を書いており、私は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になっていないことを知っている

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ファイルの私の問題intentです。私は帰りの問題があると思う。ここではそのリターン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"); 
    } 
}; 

に戻ってきていない私のhelperClass.js内の関数は読みいただきありがとうございます。私はあなたの提案を歓迎します。

+1

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-コール) – rohithpr

+0

@rohithpr私は自分の質問に答えました。 – Adrian

答えて

-2

返品の方法は、helperClassから送られたものではありません。問題は、最初の呼び出しがどのように行われたかです。

helperClassについては、元の返品に戻しました。 index.jsクラスで

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

、私はそうのように、try-catchブロックにhelperClassへの呼び出しを置く:彼らは同じ問題に実行する場合、うまくいけば

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; 
    } 
    } 
); 

、誰かがこれは便利見つけました。