2017-02-09 66 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