7

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

我在使目录发现异步(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 fiberfuture2. 当我注释掉Future.wait(dirs)服务器不再崩溃时,但这就是我试图解决这个问题的程度。:/

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

4

1 回答 1

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"); });

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

另一件可能有用的事情是var funcSync = Meteor._wrapAsync(func)它利用期货并允许使用以同步方式调用函数(但它仍然是异步的)。

如果您想了解更多信息,请观看这​​些视频:https ://www.eventedmind.com/posts/meteor-dynamic-scoping-with-environment-variables https://www.eventedmind.com/posts/meteor-什么是流星绑定环境

于 2013-08-21T00:35:20.363 回答