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

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

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

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

Q&A

解決済

4回答

4783閲覧

CallBackが思うように挙動しない (JavaScript)

rikoda

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2017/05/01 07:59

###前提・実現したいこと
これでコールバックが働かない理由はなぜ?
/Users/test/tags ディレクトリ内にある filestagFilesに代入して出力したいのですが、(コールバックが働いていないのか?) tagFiles is not defined がでてしまいます。
なぜ tagFiles がとれないのでしょうか。

###発生している問題・エラーメッセージ

tagFiles is not defined

###該当のソースコード

JavaScript

1var func1 = function(Callback) { 2 tagFiles = fs.readdir('/Users/test/tags', function(err, files) { 3 if (err) throw err; 4 console.log(files); //ここでは取れている 5 return files; 6 }); 7 console.log(tagFiles); //ここではundefined 8 Callback(tagFiles); 9}; 10 11 12var func2 = function(tagFiles) { 13 console.log(tagFiles); //ここではundefined 14}; 15 16 17func1(func2);

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

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

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

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

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

guest

回答4

0

tagFiles = fs.readdir('/Users/test/tags', function(err, files) { if (err) throw err; console.log(files); //ここでは取れている return files; });

ここの部分自体が、fs.readdirのコールバックになっているので、ファイルの取得が出来る前に

console.log(tagFiles); //ここではundefined Callback(tagFiles);

が実行されてしまうのでは無いでしょうか?
上のコールバック内でCallbackを動作させる訳にはいきませんか?

投稿2017/05/01 08:11

yoorwm

総合スコア1305

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

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

rikoda

2017/05/01 08:21

コールバック内で行うとreturn前で行うと変数が取れず、return後に行うとそもそも働きませんでした。アドバイスありがとうございます。
guest

0

ベストアンサー

fsモジュールのreaddirメソッドは非同期処理であるため、readdirが実行された後、実際にディレクトリ情報が読み取られるより先に次の行へ処理が進みます。
readdir自体は戻り値を返さず、取得されたディレクトリ情報はreaddirのcallback関数に渡されるため、tagFilesにはundefinedが入ってしまいます。

var func1 = function(Callback) { tagFiles = fs.readdir('/Users/test/tags', function(err, files) { // 1. readdir実行, tagFilesにはundefinedが入る if (err) throw err; console.log(files); // 3. 実際にディレクトリ情報が取得されてからcallbackが実行されるので、fileにはディレクトリ情報が入る。 return files; }); console.log(tagFiles); // 2. readdirが実際にディレクトリ情報を取得するのを待たずに実行される。 Callback(tagFiles); };

期待通りの動作にするためには、func1を以下のいずれかのように修正する必要があるでしょう。

// readdirのコールバック内で、func1のcallbackを実行する var func1 = function(Callback) { fs.readdir('/Users/test/tags', function(err, files) { if (err) throw err; var tagFiles = files; console.log(tagFiles); Callback(tagFiles); }); };
// fsモジュールのreaddirSyncを使う var func1 = function(Callback) { var tagFiles = fs.readdirSync('/Users/test/tags'); console.log(tagFiles); Callback(tagFiles); };

https://nodejs.org/api/fs.html#fs_file_system

投稿2017/05/01 08:30

philomagi

総合スコア267

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

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

0

fs.readdir(path[, options], callback)

Asynchronous readdir(3). Reads the contents of a directory.

readdir は非同期です。readdir を呼び出しても、処理が終わる前にもとのスレッドの続きが開始しますので、戻り値は使えません。
同期処理をする場合には、readdirSync を使ってください。

投稿2017/05/01 08:15

Zuishin

総合スコア28656

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

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

0

tagFiles is not defined

Strict Mode においては、var, let, const 等の変数宣言がない状態で変数を参照すれば、ReferenceErrorを返す仕様です。

Re: rikoda さん

投稿2017/05/01 08:13

編集2017/05/01 08:22
think49

総合スコア18156

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

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

rikoda

2017/05/01 08:21

スコープの問題を避けるためにあえてグローバル変数としております。
think49

2017/05/01 08:24

いえ、そういうことではなく、「tagFiles is not defined」という事は ReferenceError が発生しているのですよね。 Strict Mode だから var なしでグローバル変数を宣言できていないのではないでしょうか。
think49

2017/05/01 08:25

「undefined が参照される事」と「ReferenceError が発生する事」は全く別個の問題です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問