rs.readFile在async.series排序问题中

时间:2016-07-10 05:32:40

标签: javascript node-async

显然,我在这里做错了,但我没有看到它。

我已将代码缩减到下面,以说明我遇到的问题。

使用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

我做错了什么?

1 个答案:

答案 0 :(得分: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();
  });
}