在Meteor,我正在编写一个方法,必须检查某个路径的子目录的新文件.我首先想列出其中的子目录,Meteor之后是child_process.exec一个简单的bash脚本,列出自上次执行以来添加的文件.
我在将目录发现设置为async(Error: Can't wait without a fiber)时遇到了一些问题.我已经编写了一个同步版本但是同时使用它们fs.readdir而fs.stat不是它们的同步替代版本允许我捕获错误.
这是代码:
function listDirs(dir, isDir){
var future1 = new Future();fs.readdir(dir, function(err, files){
if (err)
throw new Meteor.error(500, "Error listing files", err);
var dirs = _.map(files, function(file){
var future2 = new Future();
var resolve2 = future2.resolver();
fs.stat(dir+file, function(err, stats){
if (err)
throw new Meteor.error(500, "Error statting files", err);
if (stats.isDirectory() == isDir && file.charAt(0) !== '.')
resolve2(err, file);
});
return future2;
});
Future.wait(dirs);
//var result = _.invoke(dirs, 'get');
future1['return'](_.compact(dirs));
});
return future1.wait();
}
Run Code Online (Sandbox Code Playgroud)
错误Error: Can't wait without a fiber与此有关future2.当我发表评论时Future.wait(dirs),服务器不再崩溃,但这就是我试图解决这个问题.:/
_.map我在方法的另一部分使用的另一个函数适用于期货.(另见https://gist.github.com/possibilities/3443021,我找到了灵感)
ims*_*vko 14
将你的回调包装成Meteor.bindEnvironment例如:
fs.readdir(dir, Meteor.bindEnvironment(function (err, res) {
if (err) future.throw(err);
future.return(res);
}, function (err) { console.log("couldn't wrap the callback"); });
Run Code Online (Sandbox Code Playgroud)
Meteor.bindEnvironment 做了很多事情,其中之一是确保回调在光纤中运行.
另一件可能有用的事情是var funcSync = Meteor._wrapAsync(func)使用期货并允许使用以同步方式调用函数(但它仍然是异步的).
如果您想了解更多信息,请立即观看这些视频:https : //www.eventedmind.com/posts/meteor-dynamic-scoping-with-environment-variables https://www.eventedmind.com/posts/meteor-什么-是-流星bindenvironment