【问题标题】:Future.wait() can't wait without a fiber (while waiting on another future in Meteor.method)Future.wait() 不能等待没有纤程(在 Meteor.method 中等待另一个未来时)
【发布时间】:2013-08-23 04:48:48
【问题描述】:

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 future


    【解决方案1】:

    将您的回调封装到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-variableshttps://www.eventedmind.com/posts/meteor-what-is-meteor-bindenvironment

    【讨论】:

    • 谢谢!在Meteor.bindEnvironment 中包装回调确实解决了期货问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2020-08-11
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多