官方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); } }); }
运行结果如下:
图中,红色框体为每个文件的检测结果,黑色框体为每个文件检查结束时,回调函数获取的文件名称。
从结果,我们一眼就能看出是因为异步,导致了回调的时候循环已经结束。所以每次回调获取的都是最后一个文件的信息。
解决方案有好多,这里只说闭包处理。代码如下:
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)); // 调用闭包 }
转载于:https://blog.51cto.com/wangyuelucky/1608553