當我運行下面的代碼時,它總是打印5,有沒有什麼辦法可以保存狀態?讓它打印0,1,2,3,4?如何在讀取文件異步時保存變量?
for(var i=0; i<5; i++){
fs.readFile("./test.txt", "utf8", function(err, data){
console.log(i);
});
}
當我運行下面的代碼時,它總是打印5,有沒有什麼辦法可以保存狀態?讓它打印0,1,2,3,4?如何在讀取文件異步時保存變量?
for(var i=0; i<5; i++){
fs.readFile("./test.txt", "utf8", function(err, data){
console.log(i);
});
}
您可以創建一個閉包(用於此例):
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
你可以使用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);
});
}
這工作,但我認爲有一個更乾淨的方式來做到這一點http://stackoverflow.com/questions/11488014 /異步過程內-A-JavaScript的for循環 –
[for循環一個JavaScript內異步過程(可能重複的HTTP ://stackoverflow.com/questions/11488014/asynchronous-process-inside-a-javascript-for-loop) –