Future.wait() 不能没有光纤就等(在 Meteor.method 中等待另一个未来)



Meteor中,我正在编写一个方法,该方法必须检查特定路径的子目录中是否有新文件。首先,我只想列出Meteor中的子目录,然后我child_process.exec是一个简单的bash脚本,它列出了自上次执行以来添加的文件。

我在将目录发现设置为异步(Error: Can't wait without a fiber)时遇到了一些问题。我已经编写了一个同步版本,但同时使用fs.readdirfs.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 fiberfuture2有关。当我评论出Future.wait(dirs)时,服务器不再崩溃,但这大约是我试图解决这个问题的程度。:/

我在方法的另一部分中使用的另一个_.map函数可以很好地处理期货。(另请参阅https://gist.github.com/possibilities/3443021我在那里找到了灵感)

将回调封装到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"); });

Meteor.bindEnvironment做了很多事情,其中之一就是确保回调在光纤中运行。

另一个可能有用的东西是var funcSync = Meteor._wrapAsync(func),它利用期货并允许使用同步风格调用函数(但它仍然是异步的)。

如果你想了解更多信息,请观看以下视频:https://www.eventedmind.com/posts/meteor-dynamic-scoping-with-environment-variableshttps://www.eventedmind.com/posts/meteor-what-is-meteor-bindenvironment

最新更新