teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

いくつか追加で処理を変更してみたので、修正しました。回答お願いします!

2018/04/21 07:05

投稿

hamar1
hamar1

スコア26

title CHANGED
File without changes
body CHANGED
@@ -1,18 +1,9 @@
1
1
  ### 前提・実現したいこと
2
2
  Alexaを購入したので、アプリを自宅用に作成しています。
3
3
  node.jsでalexaの情報を受けて、dynamoを更新してから返答を返したいです。
4
- slack連携のアプリをnode.jsで作っているのでnode.jsにトライしています。
5
- (普段はPythonを利用していることが多いです)
6
4
 
7
5
  かなり長いですが、よろしくお願いします。
8
6
 
9
- ### 発生している問題・エラーメッセージ
10
-
11
- JavaScriptの非同期処理の順序立てのためのcallbackをうまく使えないのと、記法がよく分からないです。
12
- ```
13
- speechOutput is undefined
14
- ```
15
-
16
7
  ### 該当のソースコード
17
8
 
18
9
  ```JavaScript
@@ -23,12 +14,13 @@
23
14
  var dynamoDoc = new AWS.DynamoDB.DocumentClient({region: 'ap-northeast-1'});
24
15
  const languageStrings = {
25
16
  "ja": { "translation": {"STOP_MESSAGE": "スキルを終了します。",...}}};
17
+ dataEmitter = new myEmitter();
26
18
 
27
19
  // dynamo process
28
- function dynamoLogHandler(userGaveUp) {
20
+ function dynamoLogHandler(data) {
29
21
  var params_update = {
30
22
  TableName:'test_table',
31
- Key:{"eventId":this.request.intent.solts.test.name},
23
+ Key:{"eventId":data.request.intent.solts.test.name},
32
24
  AttributeUpdates:{
33
25
  "points":{'Action':'ADD','Value': (- this.request.intent.solts.test.value)}},
34
26
  ReturnValues:"UPDATED_NEW"
@@ -36,14 +28,19 @@
36
28
  dynamoDoc.update(params_update,function(err,data_updated){
37
29
  let speechOutput = String(data_updated.Attributes.points)+"更新しました";
38
30
  });
31
+ // 今回修正した処理
32
+ dataEmitter.emit('data',speechOutput)
33
+ // 前回質問していた時の処理-> thisがundefinedになる
39
- this.response.speak(speechOutput);
34
+ //this.response.speak(speechOutput);
40
- this.emit(':responseReady');
35
+ //this.emit(':responseReady');
41
-
42
36
  }
43
37
 
44
38
  // test intent handler
45
39
  function handlerTest(userGaveUp){
46
- let speechOutput = dynamoHandler(this);
40
+ dynamoLogHandler(this);
41
+ // 現在の処理 -> ここまでで有れば正常にdynamoUpdateが走る
42
+ let speechOutput = dataEmitter.on('data',function(speechOutput){return speechOutput;}));
43
+ // トライした処理 -> この先を入れるとresponseが[Object Object]
47
44
  // this.response.speak(speechOutput);
48
45
  // this.emit(':responseReady');
49
46
  }
@@ -66,15 +63,25 @@
66
63
  };
67
64
  ```
68
65
 
66
+ ### 全体の流れ
67
+
68
+ 1. alexa handlerでtestIntentが設定されます。
69
+ 2. testIntentHandlerが実行され、dynamoLogHandlerが呼び出されます。
70
+ 3. dynamoDBを更新します(ここにはミスはないです)
71
+ 4. dynamoLogHandlerの処理が終了すると、emitterでtestIntentHandlerに戻ります
72
+ (let speechOutput = dataEmitter.on('data',function);
73
+ 5. `this.emit(':tell',speechOutput)`で発話内容をAlexaに返します
74
+
75
+ ### 問題点
76
+ 4番までで実行すると、全てが正常に実行されて進むのですが、
77
+ この、5番を入れると、emitterが[Object Object]として定義されてしまい、3,4を実行せずに終了してしまいます。
78
+
69
79
  ### 試したこと&分かっていないこと
80
+ `emitter`を利用することで、
70
81
 
71
82
  `this.emit`の位置を変えたり、`return`を使ったり、`emitter`を使ったりしましたが、
72
83
  `this`がscopeを超えて引き継がれなかったり、そもそもreturnの位置が間違えていたりと、
73
84
  全くうまくいっていません。
74
85
 
75
86
  また、sdkを参照して作っているのですが、`userGaveUp`が何を指すのかどのような使い方ができるのかが不明です。
76
- 全ての処理は記載していないですが、うまくいっていない部分は上記になります。
87
+ 全ての処理は記載していないですが、うまくいっていない部分は上記になります。
77
-
78
- ### 補足情報(FW/ツールのバージョンなど)
79
-
80
- node.js