7

ではMeteor、特定のパスのサブディレクトリで新しいファイルをチェックする必要があるメソッドを作成しています。最初にサブディレクトリを一覧表示したMeteorchild_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 fiberは に関係していfuture2ます。コメントアウトする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多くのことを行いますが、そのうちの 1 つは、コールバックがファイバーで実行されていることを確認することです。

役立つ可能性があるもう1つのことはvar funcSync = Meteor._wrapAsync(func)、先物を利用し、同期スタイルで関数を呼び出すことができることです(ただし、それでも非同期です)。

詳細を知りたい場合は、イベントド マインドに関するこれらのビデオをご覧 ください。メテオビンデン環境とは

于 2013-08-21T00:35:20.363 に答える