2017-02-09 6 views
0

Я пытаюсь использовать ffmpeg, чтобы вырезать несколько секунд каталога с mp3. Но мои актуальные проблемы связаны с использованием обещаний.обещание flow - bluebird

Вместо запуска одного процесса 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

Я хочу последовательный подход для каждого транскода, поэтому я не получаю сразу сотни процессов и имею свой процессор на 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

Смежные вопросы