Node.js异步if语句GraphicsMagick

时间:2014-01-02 13:11:43

标签: javascript node.js asynchronous

我正在尝试在我的Node.js应用中使用GraphicsMagick库来动态处理图像。

使用以下方法选择图像后

var image = gm('/path/to/image.jpg');

我想对它执行几项操作。我面临的问题是因为要执行的操作来自变量。例如,如果模糊为true,则应模糊图像。如果比例也为真,则应缩放模糊图像。问题是,GraphicsMagic库是异步的,因此这个脚本会导致许多动作同时执行,这可能会变得非常糟糕。

这些函数接受回调,如GitHub上的this example所示。虽然它们看起来是同步的,但是answer here证实它们是异步的。answer here表明函数是同步的。

当我不知道正在执行哪些操作时,如何逐一对图像执行操作,同时保持非阻塞状态?

我正在考虑将在回调中执行的NextAction()函数。然后NextAction()将触发下一个动作,但我不确定如何解决这个问题。

我已经研究过StratifiedJS,但我决定反对它,因为我不想让我的应用程序进一步复杂化,我不认为我的PaaS支持它。

if(blur){
  image = image.blur(blur1, blur2);
}
if(scale){
  image = image.resize(resizeX, resizeY);
}
if(sepia){
  image = image.sepia();
}

1 个答案:

答案 0 :(得分:1)

当您在图像上调用方法时,

GraphicsMagick 不会执行任何操作并且工作:调整大小,模糊等等。它们非常轻量级。

实际上他们所做的一切 - 是为链添加参数(字符串到参数数组)。 因此gm()返回的对象是链对象,在执行write方法之前不会做太多。

当调用write方法时,它实际上会生成所有参数都将被传递给的进程,这就是所有计算都发生的地方,这就是为什么它是异步的。

因此,为了制作您的可选方法 - 您完全按照您需要的方式执行:

if(blur){
  image = image.blur(blur1, blur2);
}
if(scale){
  image = image.resize(resizeX, resizeY);
}
if(sepia){
  image = image.sepia();
}

最后image将包含参数数组,并向其调用write,将执行所有这些参数。每当你调用这些方法时,你可以在这里查看:https://github.com/aheckmann/gm/blob/master/lib/args.js 他们所做的就是返回带有附加参数的新修改对象。

以下是有关此问题及其工作原理的更多详情和说明:https://stackoverflow.com/a/17745079/1312722