在Meteor
中,我正在编写一个方法,它必须检查新文件的某个路径的子目录。 我首先想列出Meteor
之后的子目录,然后我child_process.exec
一个简单的bash脚本,列出自上次执行以来添加的文件。Future.wait()不能等待没有纤维(等待Meteor.method中的另一个未来)
我有一些问题,目录发现是异步(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();
}
错误Error: Can't wait without a fiber
有future2
做。 当我注释掉Future.wait(dirs)
时,服务器不再崩溃,但是就我试图解决这个问题而言。 :/
另一个_.map
函数我在该方法的另一部分使用的函数与期货工作正常。 (见https://gist.github.com/possibilities/3443021,我发现我的灵感)
谢谢!在Meteor.bindEnvironment中包装回调确实解决了期货问题。 – jeroentbt