2017-02-09 8 views
0

私はffmpegを使用してmp3でディレクトリを数秒間切り取ろうとしています。 しかし私の実際の問題は約束を使っています。promise flow - bluebird

ffmpegプロセスを1つ起動するのではなく、すぐにファイルごとに起動します。 私の推測では、約束が解決を待っているわけではなく、正しく理解していないと思います。

var P = require('bluebird'); 
var fs = P.promisifyAll(require("fs")); 

function transcode(filename) { 
    return P.delay(1000).then(function() { 
     console.log(filename); 
    }); 
} 
var in_dir = "./somedir/"; 

var getFiles = function(){ 
    return fs.readdirAsync(in_dir); 
}; 

getFiles().mapSeries(function(filename){ 
    transcode(filename); 
}); 
+0

私が答えることを試みたが、再読み込みした後、私はそれを削除しました。右のように見えませんでした。欲望の成果や効果が何であるかを明確にすることはできますか?約束(またはコールバック)を使用するとき、彼らは並んで開始するのが普通です。それから、「次のステップ」のために(thenを介して)通知を受け取ります。 –

+0

私は各トランスコードのシーケンシャルなアプローチをしたいので、一度に何百ものプロセスを開始せず、CPUを100%にしています。私は '.mapSeries()'を使ってみました。または、最大5つのプロセスのキューがありますか? –

+1

['Promise'コンストラクタの反パターンを避けてください](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! 'ffmpeg()。...'チェーンだけをコンストラクタのコールバックに入れてください。ただし、 'getDuration(in_file)'約束はしないでください。 – Bergi

答えて

1

私はあなたのコードの簡略版を作成しました。唯一欠けているものは、最終的な閉鎖のためのreturn声明た:

var P = require('bluebird'); 
var fs = P.promisifyAll(require("fs")); 

function transcode(filename) { 
    return P.delay(1000).then(function() { 
     console.log(filename); 
    }); 
} 
var in_dir = "./somedir/"; 

var getFiles = function(){ 
    return fs.readdirAsync(in_dir); 
}; 

getFiles().mapSeries(function(filename){ 
    return transcode(filename); 
}); 
+0

それはまさにそれでした、ありがとう! –

+0

私の質問をあなたの簡略化されたコードに編集して(私のエラーで)、他の人がもっと役に立つかもしれないようにする –

+2

...または単に 'getFiles()。mapSeries(transcode)' – Bergi