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
- 在node.js中使用嵌套for循环内的Promise
- 单独函数中的HTTP请求
- 与asynchronous系列控制stream混淆
- Nodejs没有执行asynchronous的promise函数
- 节点教程 – LearnYouNode – 杂耍asynchronous – 使用嵌套的callback
- node.js lambda函数将logging从sql迁移到elasticsearch,使用队列限制asynchronous调用
- Socket.io同步倒计时?
- 在.NET中使用C#可以在没有multithreading的情况下实现基于事件的asynchronous模式吗?
- Node.js – 寻找asynchronous函数