У меня есть код, где я обрезаю изображение перед сохранением его в коллекции, но код выполняется асинхронно. Вставка в коллекцию выполняется до того, как изображение будет обрезано.
Meteor.methods({
'createWorkout': function(workoutFormContent, fileObj) {
// crop image to width:height = 3:2 aspect ratio
var workoutImage = gm(fileObj.path);
workoutImage.size(function(error, size) {
if (error) console.log(error);
height = size.height;
width = size.height * 1.5;
workoutImage
.gravity("Center")
.crop(width, height)
.write(fileObj.path, function(error) {
if (error) console.log(error)
});
});
// add image to form content and insert to collection
workoutFormContent.workoutImage = fileObj;
Workouts.insert(workoutFormContent, function(error) {
if (error) {
console.log(error);
}
});
},
});
Как я могу запустить этот код синхронно, чтобы иметь возможность вставлять уже обрезанное изображение?
Запись в коллекцию только после обрезания изображения:
import { Meteor } from 'meteor/meteor';
import gm from 'gm';
const bound = Meteor.bindEnvironment((callback) => {callback();});
Meteor.methods({
createWorkout(workoutFormContent, fileObj) {
// crop image to width:height = 3:2 aspect ratio
const workoutImage = gm(fileObj.path);
workoutImage.size((error, size) => {
bound(() => {
if (error) {
console.log(error);
return;
}
const height = size.height;
const width = size.height * 1.5;
workoutImage.gravity('Center').crop(width, height).write(fileObj.path, (writeError) => {
bound(() => {
if (writeError) {
console.log(writeError);
return;
}
// add image to form content and insert to collection
workoutFormContent.workoutImage = fileObj;
Workouts.insert(workoutFormContent, (insertError) => {
if (insertError) {
console.log(insertError);
}
});
});
});
});
});
}
});
Или используйте Fibers/Future
lib, которые можно использовать для блокировки цикла событий.