Метеор выполняет функции синхронно

1

У меня есть код, где я обрезаю изображение перед сохранением его в коллекции, но код выполняется асинхронно. Вставка в коллекцию выполняется до того, как изображение будет обрезано.

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);
            }
        });
    },
});

Как я могу запустить этот код синхронно, чтобы иметь возможность вставлять уже обрезанное изображение?

Теги:
meteor

1 ответ

1
Лучший ответ

Запись в коллекцию только после обрезания изображения:

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, которые можно использовать для блокировки цикла событий.

  • 0
    Я пробовал это решение, и оно не работает. Метеор жалуется, что функция должна быть запущена в волокне.
  • 0
    @ Андрей, пожалуйста, смотрите мой обновленный ответ
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню