2016-07-10 8 views
0

Klar mache ich hier etwas falsch, aber ich sehe es nicht.rs.readFile in async.series Sequencing-Problem

Ich habe meinen Code reduziert, um das Problem zu illustrieren, das ich habe.

Mit async.series Ich verarbeite eine Reihe von Dateien. Für jede Datei lese ich es und mache etwas mit dem Inhalt und gehe weiter. Wenn ich den readFile Aufruf von readFileSync ändere, bekomme ich die erwartete Ausgabe, aber das ist keine Lösung, die hier aus einer Vielzahl anderer Gründe funktionieren wird.

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

huh(); 

function huh() { 
    for (var i in [1,2]) { 
     async.series([ 
       function (callback) { process('a', callback); }, 
       function (callback) { process('b', callback); } 
      ], function() { console.log('series done')}); 
     console.log('done: ' + i); 
    } 
} 

function process(word, callback){ 
    fs.readFile('whatever', function (err, content) { 
     console.log(word); 
     callback(); 
    }); 
} 

Was ich erwarte, wenn ich die oben ausgeführt ist:

a 
b 
series done 
done: 0 
a 
b 
series done 
done: 1 

Aber was ich bekommen ist

done: 0 
done: 1 
a 
a 
b 
series done 
b 
series done 

Was mache ich falsch?

+0

console.log ('gemacht:' + i); ist also erstmal sync, da ist nichts verkehrt, was du erwartest ist fs.readFileSync, nutze sync code um deine erwartungen zu erfüllen –

+0

leider, wie ich in der frage notiere, kann ich fs nicht verwenden. file_read –

+0

ok, dann put alle in async.series, werde ich in der Antwort detailliert –

Antwort

0

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

 
huh(); 
 

 
function huh() { 
 
    var queue = []; 
 
    for (var i in [1, 2]) { 
 
    (function(tmpi) { 
 
     queue.push(function(callback) { 
 
     process('a', callback); 
 
     }); 
 
     queue.push(function(callback) { 
 
     process('b', callback); 
 
     }); 
 
     queue.push(function(callback) { 
 
     console.log('series done'); 
 
     callback() 
 
     }); 
 
     queue.push(function(callback) { 
 
     console.log('done: ' + tmpi); 
 
     callback() 
 
     }); 
 

 
    })(i); 
 

 

 

 

 
    } 
 
    async.series(queue, function() { 
 
    console.log('all done!') 
 
    }); 
 

 
} 
 

 
function process(word, callback) { 
 
    fs.readFile('whatever', function(err, content) { 
 
    console.log(word); 
 
    callback(); 
 
    }); 
 
}