2017-02-09 141 views
0

我试图用ffmpeg剪下一个带有mp3的目录几秒钟。 但我的实际问题与使用承诺。诺言流 - 蓝鸟

而不是在另一个之后启动一个ffmpeg进程,它立即为每个文件启动一个进程。 我的猜测是承诺没有等待解决方案,我没有正确理解它。

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' constructor antipattern](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)!在构造函数回调中只放入'ffmpeg()。...'链,而不是'getDuration(in_file)'promise。 – 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(转码)' – Bergi