官方API:

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback



问题描述:

数组arr存放了一组文件路径,循环检测每一个文件是否可达,如果可达做进一步的处理。


代码如下:

var i,len,fp
    arr = [
    "\\略\\ext\\app\\Controller.js", 
    "\\略\\application\\Application.js",
    "\\略\\application\\ApplicationGrid.js",
    "\\略\\SampleApplicationType.js",
    "\\略\\application\\ApplicationPanel.js",
    "\\略\\controller\\mainFrame\\Main.js",
    "\\略\\ext\\data\\Store.js",
    "\\略\\common\\ext\\grid\\Panel.js",
    "\\略\\application\\ApplicationPanel.js",
    "\\略\\common\\ext\\form\\Panel.js"
];


for(i=0,len=arr.length; i< len; i++){
	fp = arr[i]; // 文件路径

	fs.exists(fp, function(exist){
		if(exist){
			console.log('ok, file : ' + fp);
		}else{
			console.log('error, file : ' + fp);
		}
	});
}


运行结果如下:

wKioL1TGBPny-sbqAAJA43kL5ok853.jpg

图中,红色框体为每个文件的检测结果,黑色框体为每个文件检查结束时,回调函数获取的文件名称。



从结果,我们一眼就能看出是因为异步,导致了回调的时候循环已经结束。所以每次回调获取的都是最后一个文件的信息。




解决方案有好多,这里只说闭包处理。代码如下:

for(i=0,len=arr.length; i< len; i++){
	fp = arr[i]; // 文件路径

	fs.exists(fp, (function(/**fp ?  exist?*/){
		if(exist){
			console.log('ok, file : ' + fp);
		}else{
			console.log('error, file : ' + fp);
		}
	})(fp));
}

但是,这样就覆盖了fs.exists(path,callback),给callback传递的参数,exist。



最后,可以用类似Ext的pass方法http://wangyuelucky.blog.51cto.com/1011508/1594617


代码如下:

function pass(fn, file, scope) { // 闭包给回调函数传参
	var args = [file];

	return function(exists) {
		var fnArgs = [exists].concat(args);
		fnArgs.push.apply(fnArgs, arguments);
		return fn.apply(scope || this, fnArgs);
	};
}

function existCallBack(exists,fp){ // 回调
	if(exists){
		console.log('ok, file : ' + fp);
	}else{
		console.log('error, file : ' + fp);
	}
}


for(i=0,len=arr.length; i< len; i++){
	fp = arr[i]; // 文件路径

	fs.exists(fp, pass(existCallBack,fp)); // 调用闭包
}