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

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

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

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

JavaScript

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

Q&A

解決済

1回答

698閲覧

【node.js】外部ファンクションの処理結果を待って処理をしたい

asakura

総合スコア29

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2017/09/23 07:20

node.jsで外部ファイル内のファンクションを呼び出し、
処理結果を呼び出し元に戻して、次の処理を行いたいのですが、
処理結果を待たずに次の処理を行ってしまい、
意図する挙動になりません。

具体的な処理の内容は以下の通りですが、
⑤の箇所でつまずいています。
どのように対応したら良いか、お教え頂けないでしょうか。

<処理の流れ>
①main.jsからsub.jsを呼び出し
②sun.js内のファンクションに引数(text)を送り
③sub.js内でtext2へ加工
④加工後、main.jsへ戻し
⑤加工後の結果を待って処理を行う
⇒結果を待たずに次の処理を行ってしまいます。

<処理結果>
以下のようになってしまい、処理結果を待たずに次の処理を行ってしまう。

加工後の確認: 吾輩は猫である ごろにゃん。
結果を確認: undefined

js

1// 呼び出し元:main.js 2// 外部ファイルを読み出し、非同期処理を行う 3var exportsub = require('./sub.js'); 4 5var text = "吾輩は猫である"; 6// console.log(text); 7hogehoge = (exportsub.submodule(text)); 8console.log("結果を確認:", hogehoge);

js

1// 呼び出し先:sub.js 2exports.submodule = function(text) { 3 // console.log("引渡し値の確認:", text); 4 var text2 = (text + " ごろにゃん。"); 5 console.log("加工後の確認:", text2); 6 setTimeout(function() { 7 return text2; 8 }, 1000) 9}

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

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

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

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

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

guest

回答1

0

ベストアンサー

残念ながら、setTimeoutの中にreturnを書いても、それでexports.submoduleからの帰りを待ってくれるわけではなく、関数自体はそのままreturnします

なので、「非同期処理が終わった時点で何かする」処理を書くには、以下の2つのどちらかの方法が必要となります。

  • 「非同期の処理が終わったときに呼び出す関数」を、関数の引数に渡す
  • Promiseを返して、受け取った側でthenで処理をセットするなりasync-awaitを使うなりする

投稿2017/09/23 07:45

maisumakun

総合スコア145183

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

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

asakura

2017/09/23 08:58

ありがとうございました。 Promiseで対応してみました。
asakura

2017/09/23 08:59

念のため修正したコードを添付します。 ---main.js // 外部ファイルを読み出し、戻りを待って同期処理を行う var exportsub = require('./sub.js'); var text = "吾輩は猫である"; // console.log(text); // hogehoge = (exportsub.submodule(text)); exportsub.submodule(text).then(function(result) { console.log("結果を確認:", result); console.log("次の処理"); }); ---sub.js exports.submodule = function(text) { return new Promise(function(resolve) { // console.log("引渡し値の確認:", text); var text2 = (text + " ごろにゃん。"); console.log("加工後の確認:", text2); setTimeout(function() { resolve(text2); }, 1000); }) };
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問