【问题标题】:promise flow - bluebird承诺流 - 蓝鸟
【发布时间】: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 个进程的队列?
  • 避免使用Promise constructor antipattern!在构造函数回调中只放置 ffmpeg().… 链,而不是 getDuration(in_file) 承诺。
  • 我对使用该反模式感到内疚,因为它看起来最简单,感谢您的关注。
  • 运行 bluebird 并发出警告该库实际上可以自动识别这些“缺少返回”错误并让您确切知道它们发生在哪里。

标签: node.js promise bluebird


【解决方案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);
});

【讨论】:

  • 我会将我的问题编辑为您的简化代码(带有我的错误),以便其他人将来可能会发现它更有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2014-02-13
  • 2014-11-06
  • 2015-09-06
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多