官方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
本文介绍了解决Node.js中异步文件检测循环回调覆盖问题的方法,通过闭包和Pass方法实现了文件路径的正确回调。适用于前端开发、后端开发等领域的Node.js项目。

418

被折叠的 条评论
为什么被折叠?



