2015-06-09 63 views
0

當我運行下面的代碼時,它總是打印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

[for循環一個JavaScript內異步過程(可能重複的HTTP ://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript-for-loop) –

回答

1

您可以創建一個閉包(用於此例):

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

您創建一個匿名函數,但的範疇。請注意,您可以得到數以不同的順序,如讀取文件是一個異步操作:

> 0 
1 
2 
3 
4 

或:

> 0 
2 
1 
3 
4 
0

你可以使用promise作爲例子。

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

+1

這工作,但我認爲有一個更乾淨的方式來做到這一點http://stackoverflow.com/questions/11488014 /異步過程內-A-JavaScript的for循環 –