如何在读取文件异步时保留变量?

时间:2015-06-09 13:10:34

标签: node.js

当我运行下面的代码时,它总是打印5,有什么方法可以保存状态?让它打印0,1,2,3,4?

for(var i=0; i<5; i++){
    fs.readFile("./test.txt", "utf8", function(err, data){
        console.log(i);
    });
}

2 个答案:

答案 0 :(得分:1)

您可以创建一个闭包(对于这种情况很有用):

for(var i=0; i<5; i++){
    fs.readFile("./test.txt", "utf8", function(i) {
        return function(err, data) {
            console.log(i);
        };
    }(i));
}

您创建了一个匿名函数,但在作用域中使用了 i 。请注意,您可以按不同的顺序获取数字,因为读取文件是异步操作:

> 0
1
2
3
4

或:

> 0
2
1
3
4

答案 1 :(得分:0)

例如,你可以使用promises。

var Q = require('q');
var fs = require('fs');

var readFile = function(i) {
  var deferred = Q.defer();

  fs.readFile("./test.txt", "utf8", function(err, data) {
    deferred.resolve(i);
  });

  return deferred.promise;
};

for (var i = 0; i < 5; i++) {
  readFile(i).then(function(result) {
    console.log(result);
  });
}