2016-07-10 16 views
0

很明顯,我在這裏做錯了什麼,但我沒有看到它。async.series中的rs.readFile排序問題

我把代碼縮小到了下面來說明我遇到的問題。使用async.series我正在處理一組文件。對於每個文件,我閱讀它,然後對內容進行一些處理,然後繼續。如果我將readFile調用更改爲readFileSync,我會得到預期的輸出結果,但這不是因爲各種其他原因而在此工作的解決方案。

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(); 
    }); 
} 

我期待什麼,當我運行上面的是:

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

但我得到的是

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

我在做什麼錯?

+0

的console.log( '完成的:' + I);是同步所以起初,沒有什麼不對,你所期望的是fs.readFileSync,使用同步代碼來匹配你的期望 –

+0

不幸的是,正如我在問題中指出的,我不能使用fs.readFileSync –

+0

好吧,然後把所有進入async.series,我會在答案中詳細說明 –

回答

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(); 
 
    }); 
 
}