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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

2回答

604閲覧

[Node.js] callback関数から情報を取り出したい

HiDinner

総合スコア1

Node.js

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/03 06:01

編集2021/10/03 06:02

解決したい事

そのファイルが存在するかを判定する関数を作りたい

Node.js - v12

やってみた事

file

1├─data //dataファイル内に存在するかどうか 2└─api 3 └─file.js

js

1//file.js 2const isAvaiableFile = (file:string):any=>{ 3 new Promise((resolve, reject) => { 4 fs.readdirSync(__dirname+"/../data",(err:any,files:any)=>{ 5 console.log(files) 6 if(files.some((v:any)=>v==file)) resolve(true) 7 else resolve(false) 8 }) 9 }) 10}

を実行して、結果をコンソールに表示しましたが

Promise{ <pending> }

が表示されました。
どこをどのようにして修正すればよいでしょうか。

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

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

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

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

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

guest

回答2

0

ほとんど miyabi-sun の回答で良いと思いますが、2つほど気になったことがありました。

  1. isAvaiableFileの戻り値が指定されていない

isAvaiableFile関数ですが、戻り値が指定されていないため、このままだとエラーが発生すると思います。

typescript

1const isAvaiableFile = (file:string):any=>{ 2 return new Promise(...) 3}

と書くか、

typescript

1const isAvaiableFile = (file:string):any=>( // {} ではなく、 () を使う 2 new Promise(...) 3)

と書く必要があります。
解説すると、アロー関数は下記の通り書くことができます。

javascript

1// Pattern1 (基本的な書き方) 2const func1 = (arg1, arg2) => { 3 // 関数の処理 4 ... 5 return result // 結果を返却。書かないと戻り値はundefinedになる 6} 7 8// Pattern2 (関数の処理が1行で済むのであれば、{}とreturnを省略して書くことができる) 9const func2 = (arg1, arg2) => arg1 + arg2 10 11// Pattern3 (引数が1つの場合、引数の括弧は省略できる 12const func3 = arg => { 13 ... 14} 15 16// Pattern4 2と3の組み合わせ 17const func4 = arg => 2 * arg 18 19// NGパターン 20const funcNG = arg => return arg // pattern2, 4の書き方でreturnをつけると構文エラーになります

先ほどの例のうち、括弧が{}の方はPattern1の書き方なのでreturnが必要です。一方で、括弧が()となっているのはPattern2の書き方と同等になります。よって()の時はreturnを省略して書きます。

アロー関数について、詳しくはこちらを参照するといいと思います。

  1. readdirSync ではなく readdir ではないですか?

readdirSyncSyncとなっている通り、同期処理をする時に使う関数なので、そもそもPromiseにする必要はないですね。非同期処理にするのであれば、readdir関数を使うべきですね。

長々と、しかも質問の回答と少しずれた回答になって恐縮ですが、これら2つを踏まえてisAvaiableFileを書き換えるとこんな感じかなと思います。

typescript

1// 戻り値はPromise<T>となります。TはPromiseで渡す値の型が入ります。 2// なので、今回はPromise<boolean>になるのが正しいです。 3const isAvaiableFile = (file: string): Promise<boolean> => { 4 // 豆知識ですが、コールバック関数に無名関数を渡す場合、TypeScriptの型推論が 5 // 行われるので型の指定はしなくても大丈夫です。 6 // もしエラーが出るようならおそらく型定義がインストールされていないと思います。 7 return new Promise((resolve, reject) => { 8 fs.readdir(__dirname + "/../data", (err, files) => { 9 if (err) { // readdirに失敗した時 10 reject(err) 11 return 12 } 13 resolve(files.some((v:any) => v === file)) 14 }) 15 }) 16} 17 18// もし同期処理でOKならこうかけます。ただし、同期処理はパフォーマンスに関する注意が必要です。 19const isAvaiableFileSync = (file: string): boolean => { 20 const files = fs.readdirSync(__dirname + "/../data") 21 return files.some((v => v === file)) 22}

投稿2021/10/08 15:33

ukyoda

総合スコア386

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

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

0

file.js

これはJavaScriptではなくTypeScriptですよね?
拡張子をtsにしましょう。

そのファイルが存在するかを判定する関数を作りたい

Promiseの使い方を学習しましょう。

js

1//file.js 2// Availableでは? 3const isAvaiableFile = (file:string):any=>{ 4 new Promise((resolve, reject) => { 5 fs.readdirSync(__dirname+"/../data",(err:any,files:any)=>{ 6 console.log(files) 7 if(files.some((v:any)=>v==file)) resolve(true) 8 else resolve(false) 9 }) 10 }) 11} 12 13const main1 = () => { 14 const filePath = "./foo.txt" 15 // Promiseはthenメソッドを叩きながらresolve(true or false)の値を取り出す事になる 16 isAvaiableFile(filePath).then(isExist => { 17 // promise使ったので同期処理の世界にはもう帰ってこれない 18 console.log(isExist) 19 }) 20} 21 22// await構文を使うにはasync関数である事が必須 23const main2 = async () => { 24 const filePath = "./foo.txt" 25 // await構文を使ってresolve(true or false)の値を取り出す 26 const result = await isAvaiableFile(filePath) 27 console.log(result) 28}

投稿2021/10/04 03:23

miyabi-sun

総合スコア21203

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問