Node.jsasynchronousif语句GraphicsMagick

我正在尝试在我的Node.js应用程序中使用GraphicsMagick库来即时处理图像。

在图像被select后使用:

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

我想对它执行几个操作。 我面临的问题是因为要执行的行为来自variables。 例如,如果模糊是真的,它应该模糊图像。 如果比例也是如此,那么模糊的图像应该被缩放。 麻烦的是,GraphicsMagic库是asynchronous的,所以这个脚本会导致许多动作同时执行,这可能会变成可怕的。

这些函数确实接受callback,如GitHub上的示例所示。 尽pipe它们看上去是同步的,但是这里的答案证实它们是asynchronous的。 这里的新答案表明这些函数是同步的。

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

我正在思考沿着NextAction()函数的行,这将在callback中执行。 NextAction()然后会触发下一个动作,但我不知道如何去做这件事。

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

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

GraphicsMagick不会做任何执行和工作,当你调用图像的方法,如:resize,模糊等,他们是非常轻量级的。

事实上,他们所做的就是向链中添加参数(将string添加到参数数组中)。 所以gm()返回的对象是链对象,在执行write方法之前并没有太多的工作。

当调用write方法时,实际上会产生所有参数都会被传递的过程,这就是所有计算发生的地方,这就是为什么它是asynchronous的。

所以为了使你的可选方法 – 你做到这一点你需要做到这一点:

 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