我有这种方法在将图像保存到parse.com数据库并将其缩小之前抓取图像。
看一下代码:
var Image = require("parse-image"); // module
Parse.Cloud.beforeSave("Garments", function(request, response) {
Parse.Cloud.httpRequest({
url: request.object.get("image").url()
}).then(function(response) {
var image = new Image();
return image.setData(response.buffer);
}).then(function(image) {
// Resize the image.
return image.scale({
width: 300,
height: 450
});
}).then(function(image) {
// Make sure it's a JPEG to save disk space and bandwidth.
return image.setFormat("JPEG");
}).then(function(image) {
// Get the image data in a Buffer.
return image.data();
}).then(function(buffer) {
// Save the image into a new file.
var base64 = buffer.toString("base64");
var cropped = new Parse.File("image.jpg", { base64: base64 });
return cropped.save();
}).then(function(cropped) {
// Attach the image file to the original object.
request.object.set("image", cropped);
}).then(function(result) {
response.success();
}, function(error) {
response.error(error);
});
});
问题:
是否可以再为5张图片做以上操作?
我共有6个图片列。
image,image2,image3,image4,image5,image6
如果没有填充“image”列,则行将永远不存在。其他图像是可选的。因此,当缩放时我需要继续并缩放“图像”,如果不存在image2,image3,image4,image5和image6,则不会抛出任何错误。如果它们确实存在,那么也将它们缩小。
我正坐在这里试图想出一种有效的编码方式。如果一个javascript专家想出一些东西,我真的很感激。
我觉得我再也不会重复这段代码了。
感谢您的时间
答案 0 :(得分:1)
将大部分代码转换为返回最终承诺的函数,并使用Parse.Promise.when()
等待一系列承诺完成,这里有一些让你入门:
var imagePromises = [];
var garment = request.object;
// you said "image" is always populated, so always add it
imagePromises.push(createImagePromise(garment, "image", garment.get("image").url()));
// now conditionally add the other promises, using a loop to further reduce repeated code
for (var i = 2; i < 7; i++) {
var imageColumn = "image" + i;
if (garment.get(imageColumn) && garment.get(imageColumn).url()) {
imagePromises.push(createImagePromise(garment, imageColumn, garment.get(imageColumn).url()));
}
}
// now we have all the promises, wait for them all to finish before we're done
Parse.Promise.when(imagePromises).then(function () {
response.success();
}, function (error) {
response.error(error);
});
唯一的最后一部分是制作createImagePromise()
功能。
function createImagePromise(garment, imageColumn, url) {
// we want to return the promise
return Parse.Cloud.httpRequest({
url: url
}).then(function (response) {
// ... etc ...
}).then(function (cropped) {
// Attach the image file to the original object.
garment.set(imageColumn, cropped);
});
}
注:
允许运行的时间有limit,beforeSave
只有 3秒才能终止运行,这可能不够长处理6张图片。