4

caolan の「async」モジュールを使用して、ファイル名の配列 (この場合はテンプレート ファイル名) を開きます。

ドキュメントによると、私は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

つまり、最後のコールバックが起動していないようです。最終的なコールバックを起動するにはどうすればよいですか?

4

2 に答える 2

10

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

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
于 2012-02-27T19:42:12.670 に答える
1

私の意見では、これが最善の方法です。結果パラメーターには、ファイル データを含む文字列の配列が含まれ、すべてのファイルが並行して読み取られます。

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);
});
于 2014-08-15T14:36:00.357 に答える