2017-11-23 4 views
0

私はジェネレータを使って非同期操作(readdir)を実行し、その結果を出力しようとしています。ここでジェネレータと約束 - 結合しようとしています

は私のコードです:

var dirname = //some directory name; 
function *gen(done) { 
    let exercises = yield fs.readdir(dirname, done); 
    console.log(exercises); 
} 

let G = gen(function(err, res) { 
    G.next(res); 
}) 

G.next(); 

これは私が約束して発電機を組み合わせて、非同期操作のために、学んだことから、

の作品、版画[ 'README.md'、 'sol.js']より良い(信頼の問題)。これは本当ですか、私は誤解しましたか?

このように、私は約束を発電機と組み合わせようとしました。私はKyle SimpsonのAsynquence libraryを使用しました。

const fs = require('fs'); 
const ASQ = require('asynquence-contrib'); 

function readDirectory(dir) { 
    return ASQ(function(done){ 
     fs.readdir(dir,done); 
    }); 
} 

function *genProm() { 
    let exercises = yield readDirectory(dirname); 
    console.log(exercises); 
} 

ASQ().runner(genProm); 

今、結果は [ヌル、[ 'README.md'、 'sol.js']]

である私の質問は以下のとおりです。

  1. なぜ結果がここに異なっています?ヌルはどこから来ますか?そしてどうすればそれを取り除くことができますか?
  2. ここに約束と発電機を組み合わせることは理にかなっていますか?
+1

"*私は約束を発電機と組み合わせようとしました*" - しないでください。これは2015年です。これはES6で動作するハックです。今日は、 'async' /' await'構文を使用しなければなりません。 – Bergi

答えて

1

すみませんが、どうしてここで発電機が必要ですか?なぜasync/awaitを使用しないのですか?

このような何か:

const fs = require('fs'); 
const {promisify} = require('util'); 

const readDirectory = async dirname => await promisify(fs.readdir)(dirname); 

readDirectory("someDir").then(...); 

あなたも非同期/のawaitなく、同じ操作を行うことができます。

const fs = require('fs'); 
const {promisify} = require('util'); 

const readDirectory = dirname => promisify(fs.readdir)(dirname); 

readDirectory("someDir").then(...); 

そして最後に@Patrickロバーツはあなたが簡単に使用することができますコメントで提案されているように:

const fs = require('fs'); 
const {promisify} = require('util'); 

const readDirectory = promisify(fs.readdir); 

readDirectory("someDir").then(...); 
+1

'async'関数から' await'を削除すると、完全に冗長になります。 –

+0

はい、ついに私は両方を削除しました。 2番目のリストを参照してください。 – Constantiner

+2

すべての冗長性を取り除くなら、 'const readDirectory = promisify(fs.readdir)' –

関連する問題