【发布时间】:2017-02-10 05:20:06
【问题描述】:
我正在尝试使用 ffmpeg 剪切几秒钟的带有 mp3 的目录。 但我的实际问题来自于使用 Promise。
它不是一个接一个地启动一个 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);
});
【问题讨论】:
-
我试图回答,但重读后,我删除了它。好像不太对。你能澄清一下欲望的输出或效果是什么吗?当使用承诺(或回调)时,它们会并排开始,这是正常的。然后你会收到“下一步”的通知(通过
then)。 -
我希望每个转码都采用顺序方法,这样我就不会同时启动数百个进程并使我的 CPU 达到 100%。我尝试在底部使用
.mapSeries()。或者可能有一个最多 5 个进程的队列? -
避免使用
Promiseconstructor antipattern!在构造函数回调中只放置ffmpeg().…链,而不是getDuration(in_file)承诺。 -
我对使用该反模式感到内疚,因为它看起来最简单,感谢您的关注。
-
运行 bluebird 并发出警告该库实际上可以自动识别这些“缺少返回”错误并让您确切知道它们发生在哪里。