未来.wait() 无法在没有纤程的情况下等待(同时在 Meteor.method 中等待另一个未来)。

7
Meteor 中,我正在编写一个方法,需要检查特定路径的子目录是否有新文件。
我首先想要列出 Meteor 中的子目录,然后使用一个简单的 bash 脚本来列出自上次执行以来添加的文件(child_process.exec)。
我在异步获取目录时遇到了一些问题(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 函数,它可以很好地处理 futures。(请参阅 https://gist.github.com/possibilities/3443021,这是我找到灵感的地方)

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),它利用futures并允许我们以同步方式调用函数(但仍然是异步)。

如果您想了解更多信息,请观看这些关于evented mind的视频:https://www.eventedmind.com/posts/meteor-dynamic-scoping-with-environment-variables https://www.eventedmind.com/posts/meteor-what-is-meteor-bindenvironment


谢谢!将回调函数包装在Meteor.bindEnvironment中确实解决了未来问题。 - jeroentbt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接