1. 程式人生 > >node.js 非同步變同步——獲取一個資料夾內的所有資料夾

node.js 非同步變同步——獲取一個資料夾內的所有資料夾

獲取test資料夾內的所有資料夾:


var fs = require("fs");
fs.readdir('./test',function(err,files){
	var wenjianjia = [];
	console.log(files);
	for(var i = 0;i<files.length;i++){
		var filename = files[i];
		fs.stat('./test/'+ filename,function(err,stats){
			if(stats.isDirectory()){
				wenjianjia.push(filename);
			}
		console.log(wenjianjia);
		});
	    
	}
});

這是因為執行回撥函式時(非同步),for迴圈已經執行完,filename='ccc';

如果我們想要讀取一個資料夾,放進陣列後,在讀取第二個資料夾放入陣列,就必須同步操作

var fs = require("fs");
fs.readdir('./test',function(err,files){
	var wenjianjia = [];
	(function iterator(i){
		if(i==files.length){
			console.log(wenjianjia);
			return;
		}
		var filename = files[i];
		fs.stat('./test/'+ filename,function(err,stats){
			if(stats.isDirectory()){
				wenjianjia.push(filename);
			}
		    iterator(i+1);
		});	    
})(0)
});

或者不使用非同步函式fs.stat(),使用同步函式fs.statSync()
var fs = require("fs");
fs.readdir('./test',function(err,files){
	var wenjianjia = [];
	for(var i = 0;i<files.length;i++){
		var filename = files[i];
	    var stats = fs.statSync('./test/'+ filename);
	    if(stats.isDirectory()){
	    	wenjianjia.push(filename);
	    }
	}
	console.log(wenjianjia);
});