为什么async.filter()不接受错误?
async.filter()的文档说,迭代器callback不接受一个错误,显然“符合节点库的工作方式与像fs.exists
真相testing”。
我完全不理解这个解释。 为什么不能接受错误? 如果我的asynchronous真相testing涉及到某些可能导致错误的事情,有时呢?
例如:我有一个可能是文件或目录混合的path名称数组。 我想过滤掉目录,所以我使用async.filter
和一个调用fs.stat
的迭代器,然后调用done(stat.isFile());
。 但是,如果我的fs.stat
遇到ENOENT错误的path之一呢? 我该怎么处理这个错误?
async.filter()
方法就像.some()
和.every()
方法一样,只是针对数组中的每个项目检查true
或false
。 这些并不意味着控制stream来捕捉错误,并不意味着每一步都需要大量的处理。 async
的作者离开了你,虽然,如果你的一个检查引发错误,这可能被解释为一个false
。
如果你需要每个path名都是有效的,你可以select.each()
var filteredArray = []; async.each( paths, function( path, eachCb ){ //some asynchronous check you define checkpath( path, function( err ) { if( err ) return eachCb( err ); filteredArray.push( path ); eachCb( null ); } ); }, function( eachErr ) { if( eachErr ) { console.log( "Not all paths were correct. " + eachErr.message ); //other stuff here, perhaps a callback with this error message } else { //success! //filteredArray now filled with only valid paths, and only get here if no errors. } } );