質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Alexa

Alexa(アレクサ)は、米アマゾンが開発したクラウドベースのAIアシスタント。Amazon EchoやEcho dotに搭載され、話かけると音楽を再生したり、天気予報やスケジュールなど様々な情報を提供します。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1196閲覧

javascriptでの非同期処理の順序立て方について

hamar1

総合スコア26

Alexa

Alexa(アレクサ)は、米アマゾンが開発したクラウドベースのAIアシスタント。Amazon EchoやEcho dotに搭載され、話かけると音楽を再生したり、天気予報やスケジュールなど様々な情報を提供します。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/04/22 05:03

編集2018/04/22 05:14

前提・実現したいこと

下記のプログラムのメッセージを作成する関数createMessageを動かした後に、結果を出力(this.emit)したいです。
過去の質問、AlexaでDynamoDBを動かすを簡素化したものです。)
よろしくお願いします。

javascript

1function createMessage(data){ 2 // db access 3 params = {...} // table name and key setting. dataの中身も使う 4 dynamoDoc.query(params,function(err,res){ 5 let res_message = res.Items[0].message; // ここでメッセージを作成する 6 return res_message; 7 } 8} 9 10function handlerA(userGaveUp){ 11 // 最終的にこれを順序よく動かしたい 12 let message = createMessage(this); 13 console.log(message); //このままだとundefined 14 this.emit(':tell',message); // (*1)これが正しくemitされてほしい 15} 16 17// これが最初に実行される 18handlerA.call(this,false); 19

試したことと、発生している問題・エラーメッセージ

emitterを用いる、createMessage内でthis.emitするなど幾つかトライしましたが、

  • 上記のlet message = 関数でreturn値にした場合:undefined
  • emitterを定義してlet message=エミッタ.on()にした場合:[Object Object]
  • createMessage関数内でthis.emitする場合:thisemitが未定義です

と返されます。

なお、

  • let message = "text"では正常にtextが出力されます。
  • this.emit(':tell',message);をコメントアウトすると、正常にmessageがconsole.logで出力されます。

補足情報(FW/ツールのバージョンなど)

Node.js 6.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

dynamoDBを利用したことがないので間違っているかもしれませんが、
Promiseを使えばいいのではないでしょうか。

js

1 function createMessage(data){ 2 // db access 3 params = {...} // table name and key setting. dataの中身も使う 4 //Promiseで返す 5 return new Promise( function(resolve, reject) { 6 dynamoDoc.query(params,function(err,res){ 7 if( err ) reject(err); 8 let res_message = res.Items[0].message; // ここでメッセージを作成する 9 resolve(res_message) 10 } 11 } ) 12 } 13 14 function handlerA(userGaveUp){ 15 const self = this; 16 // Promiseでthenでつないでいく 17 createMessage(this).then(function(message){ 18 console.log(message); 19 self.emit(':tell', message); 20 }); 21 } 22 23 // これが最初に実行される 24 handlerA.call(this,false);

投稿2018/04/24 01:57

so87

総合スコア764

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hamar1

2018/04/25 01:53

ありがとうございます!試してみます!
hamar1

2018/04/28 07:15

ありがとうございます! 最初うまく行かなかったのですが、return new PromissをcreateMessageの最初の方に持っていくとすんなり通りました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問