Использование асинхронного модуля для запуска обратного вызова после прочтения всех файлов - PullRequest
4 голосов
/ 27 февраля 2012

Я использую модуль 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

Т.е. кажется, что окончательный обратный вызов не срабатывает.Что мне нужно сделать, чтобы окончательный ответный вызов сработал?

Ответы [ 2 ]

10 голосов
/ 27 февраля 2012

Функция, которая выполняется для всех элементов, должна принимать обратный вызов и передавать свои результаты обратному вызову.Смотрите ниже (я также разделил 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
1 голос
/ 15 августа 2014

На мой взгляд, это лучший способ сделать это.Параметр результатов будет иметь массив строк, содержащих данные файла, и все файлы будут считываться параллельно.

...