2

タスクは次のとおりです。フォルダーを削除する必要があり、そのコンテンツはfs2ライブラリの rmdir を使用しています。延期された promise オブジェクトを返します。完了したら、フォルダーを再度作成する必要があります。また、関数はさらに連鎖するために promise も返す必要があります。

私が今持っているコードは次のようなものです:

function clearOutputDir() {
    var def = deferred();
    var def2 = deferred();

    if (fs.existsSync(outputFolder)) {
        def.resolve(fs2.rmdir(outputFolder, {recursive: true, force: true}));
    } else {
        def.resolve();
    }

    def2.resolve(def.promise.then(function () {
        return deferred.promisify(fs.mkdir)(outputFolder);
    }));

    return def2.promise;
}

機能しているように見えますが、地獄のように醜いです。defとdef2なしでもっと簡単にできますか?

4

2 に答える 2

2

まず、未解決のプロミスを独自に作成する必要はありません。fs2 関数によって返されたプロミスを操作し、それらを「次に」使用する方がクリーンです。その場合、Plynx ソリューションは良いヒントです。

第 2 に、物事の非同期性 (およびファイル システム関数の内部動作) のため、fs.exists関数を使用しないでください。一般的に非推奨です。まったく使用しないことをお勧めしますが、やりたいことを実行することをお勧めします。直接、最終的なエラー コードに依存します。参照: https://groups.google.com/forum/?fromgroups=#!topic/nodejs/gRRuly79oRcこれについてさらに詳しく説明しています。

解決策: fs.mkdir をpromisifingする代わりに、fs2 の mkdir を使用することもできます。カスタム オプションが指定されていない限り、fs.mkdirとまったく同じように (フォールバックして) 動作し、希望どおりに動作し、promise を返します。

function clearOutputDir(outputFolder) {
    return fs2.rmdir(outputFolder, { recursive: true, force: true }).then(null, function (e) {
         // Ignore "No such dir" error, otherwise propagate further
         if (e.code === 'ENOENT') return null;
         throw e;
     }).then(fs2.mkdir.bind(fs2, outputFolder));
}

fs2.mkdirは、 fs2.rmdirが成功するか、dir が存在しない場合にのみ実行されます。bindを使用してoutputFolderで渡しましたが、次と同じ効果があります。

function clearOutuputDir(outputFolder) {
    ...
    }).then(function () { return fs2.mkdir(outputFolder); });
}

promisifyを使用する場合は、常に promisified バージョンを再利用することをお勧めします。関数呼び出しごとに作成しないでください。

var mkdir = deferred.promisify(fs.mkdir);
function clearOutputDir(outputFolder) {
    ...
   }).then(function () { return mkdir(outputFolder); });
}
于 2013-02-02T13:23:45.953 に答える
1

この目的のためにfinal-fsライブラリの使用を検討してください。チェーンの例を見てみましょう - とてもきれいです。

非同期呼び出しに whenライブラリを使用するため、コールバック地獄に陥ることはほとんどありません。チェーンは非常に簡単です。解決関数で Promise を返すことによって実行されます。

コードは次のようになります。

var ffs = require('final-fs');

/**
 * @param {string} outputDir
 * @returns {Promise}
 */
function clearOutputDir(outputDir) {
    return ffs.exists(outputDir)
        .then(function (exists) {
            if (exists) {
                return ffs.rmdirRecursive(outputDir);
            }
        })
        .then(function () {
            return ffs.mkdir(outputDir);
        });
}
于 2013-04-29T19:59:29.660 に答える