2012-02-27 10 views
4

caolan's 'async' moduleを使用して、ファイル名の配列(この場合はテンプレートファイル名)を開きます。すべてのファイルを読み込んだ後で非同期モジュールを使用してコールバックを呼び出す

ドキュメントごとに、私はasync.forEach()を使用していますので、すべての操作が完了したらコールバックを起動できます。次のように出力されている

var async = require('async') 
var fs = require('fs') 

file_names = ['one','two','three'] // all these files actually exist 

async.forEach(file_names, 
    function(file_name) { 
     console.log(file_name) 
     fs.readFile(file_name, function(error, data) { 
      if (error) { 
       console.log('oh no file missing') 
       return error 
      } else { 
       console.log('woo '+file_name+' found') 
      }  
     }) 
    }, function(error) { 
     if (error) { 
      console.log('oh no errors!') 
     } else { 
      console.log('YAAAAAAY') 
     } 
    } 
) 

簡単なテストケースがある

one 
two 
three 
woo one found 
woo two found 
woo three found 

すなわち、最終的にコールバックが発射されていないようです。最終的なコールバックを行うには何が必要ですか?

答えて

9

すべての項目で実行されている関数は、コールバックを受け取り、その結果をコールバックに渡す必要があります。 (私も読みやすくするために、ファイル名を分離しました)、以下を参照してください:

var async = require('async') 
var fs = require('fs') 

var fileNames= ['one','two','three'] 


// This callback was missing in the question. 
var readAFile = function(fileName, callback) { 
    console.log(fileName) 
    fs.readFile(fileName, function(error, data) { 
     if (error) { 
      console.log('oh no file missing') 
      return callback(error) 
     } else { 
      console.log('woo '+fileName+' found') 
      return callback() 
     }  
    }) 
} 

async.forEach(fileNames, readAFile, function(error) { 
    if (error) { 
     console.log('oh no errors!') 
    } else { 
     console.log('YAAAAAAY') 
    } 
}) 

戻り値:

one 
two 
three 
woo one found 
woo two found 
woo three found 
YAAAAAAY 
1

をこれが私の意見でそれを行うための最善の方法です。結果のparamには、ファイルデータを含む文字列の配列があり、すべてのファイルが並行して読み込まれます。

var async = require('async') 
    fs = require('fs'); 

async.map(['one','two','three'], function(fname,cb) { 
    fs.readFile(fname, {encoding:'utf8'}, cb); 
}, function(err,results) { 
    console.log(err ? err : results); 
}); 
関連する問題