2016-12-17 12 views
0
let arr = []; 

function getData(fileName, type) { 
    return fs.readFile(fileName,'utf8', (err, data) => { 
     if (err) throw err; 

     return new Promise(function(resolve, reject) { 
      for (let i = 0; i < data.length; i++) { 
       arr.push(data[i]); 
      } 

      resolve(); 
     }); 
    }); 
} 

getData('./file.txt', 'sample').then((data) => { 
    console.log(data); 
}); 

上記のコードを使用してnodejsを使用してコマンドラインで実行すると、次のエラーが発生します。ES6でファイルを読む約束

getData('./file.txt', 'sample').then((data) => { 
          ^

TypeError: Cannot read property 'then' of undefined 

どうすればこの問題を解決できますか?

あなたが新しい Promise内全体 fs.readFile呼び出しをラップして、拒否またはコールバックの結果に応じて、約束を解決したいと思う
+2

'返す新しい約束()'と 'スワップリターンfs.readFile'。戻り値のない 'fs.readFile'を返しています。 – Marty

+0

であり、 'throw'の代わりに' reject'を使うべきです。 – Julian

+0

Martyが既に示したように、現在のバージョンではPromiseではない 'fs.readFile()'の結果を返しています。あなたはおそらく 'then()'の中に別のPromiseを返すことができ、それが連鎖するという事実に基づいて混乱しているでしょう。 – androidavid

答えて

3
const getData = (fileName, type) => 
    new Promise((resolve, reject) => 
    fs.readFile(fileName, type, (err, data) => { 
     //if has error reject, otherwise resolve 
     return err ? reject(err) : resolve(data); 
    }) 
    }); 

getData('./file.txt', 'utf8') 
    .then(data => console.log('Data: ', data)) 
    .catch(error => console.log('Error: ', error)); 
+0

内部の 'return'がOPをもっと混乱させるようですね? – loganfsmyth

+0

''新しいPromise'行を '返す '必要があると思います。そうでなければ、getDataには' 'が定義されません。 – counterbeing

+2

@counterbeing 'return'は、中カッコのない矢印関数に対して暗黙的です。 – adrice727

7

function getData(fileName, type) { 
    return new Promise(function(resolve, reject){ 
    fs.readFile(fileName, type, (err, data) => { 
     err ? reject(err) : resolve(data); 
    }); 
    }); 
} 
5

誰もutil.promisifyについて語っていないので、私は投稿するつもりですが、古い質問があります。 なぜこのメッセージがありますか?

getData('./file.txt', 'sample').then((data) => { 
          ^

TypeError: Cannot read property 'then' of undefined 

getDataは、ここでは「fs.readFile」ファイルのラッパーです。 fs.readfileはthenableではなく、then関数を実装していません。他のパターン、コールバックパターン上に構築されます。最もよく知られているのは、約束です。それは私が信じているreadFileから得たいものです。少し注意してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

あなたができることは、@ hackerrdaveと同じように実装するか、またはpromisifyを使うことです:この関数は、コールバックベースの関数を変換するために実装されたNode.jsの組み込み関数です。約束されたベース。 https://nodejs.org/api/util.html#util_util_promisify_original

これは基本的に@hackerrdaveと同じですが、より堅牢で組み込みのノードutilです。ここで

はそれを使用する方法は次のとおりです。

const util = require('util'); 
const fs = require('fs'); 

const readFile = util.promisify(fs.readFile) 
readFile("path/to/myfile").then(file => console.log(file)) 
+2

私は 'const promisify = require( 'util')。promisify;でそれを拡張し、次に' promisify(fs.readFile)( "path/to/myfile")とthen(...) 'を直接使用します。通常のコールバックのエラー引数は、 'then'関数には存在しませんが、' catch'の中にあることを覚えておいてください。 –

+1

実際、catch文を追加します。そしてrequire文も同様に編集しますが、私はそれについては考えていませんが、util全体を必要とする必要はありません。 –

関連する問題