Используйте ImageMagic синхронно

Попробуйте использовать имиджмагик

Необходимо синхронно использовать imagemagick.

То есть следующий код должен быть выполнен только после того, как конвертация изображения будет завершена (независимо от того, с ошибкой или успешно)

Я вижу только одно решение с рассинхронизация:

const ImageMagick = require('imagemagick');
const Deasync = require('deasync');

var finished = false;
ImageMagick.convert(
  [
    source,
    path_to
  ],
  function(err, stdout){
    finished = true;
});

Deasync.loopWhile(function(){return !finished;});

// the next code performed only after image convertion will be done

Есть ли варианты, как работать с imagemagick синхронно?

Природа node.js асинхронна, в node.js не должно быть необходимости делать что-то синхронно.

Teemu 22.05.2019 13:32

Почему бы вам не обернуть вызов ImageMagick.convert в обещание и не использовать async/await? Или promise.then?

TKoL 22.05.2019 13:33

@TKoL, это хорошая идея. Спасибо!

Alexander Ladonin 22.05.2019 14:47
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
3
935
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Node.js является однопоточным, поэтому вам следует стараться избегать таких функций, как эта синхронизация. Вероятно, вы можете просто выполнить свой код в функции обратного вызова.

const ImageMagick = require('imagemagick');

ImageMagick.convert(
  [
    source,
    path_to
  ],
  function(err, stdout){
    // the next code performed only after image convertion will be done
});

Или вы можете использовать Promise и await, но тогда вся ваша функция будет асинхронной.

const ImageMagic = require('imagemagick');

function convertImage(source, path_to){
    return new Promise((resolve, reject) => {
        ImageMagick.convert(
            [
                source,
                path_to
            ],
            function(err, stdout){
                if(err) {
                    reject(err)
                }
                resolve(stdout);
            });
    })
}

async function doStuff(){
    // start the image convert
    let stdout = await convertImage(source, path_to);
    // now the function will go on when the promise from convert image is resolved
    // the next code performed only after image convertion will be done
}

Я думал об этом, но в моем случае невозможно ввести следующий код в callback.

Alexander Ladonin 22.05.2019 13:38

Можете ли вы отредактировать свой вопрос с более подробной информацией, почему вы не можете этого сделать, поэтому тогда вы можете найти решение.

BraveButter 22.05.2019 13:42

BraveButter, здесь будет проще сказать — я перевожу свой проект с PHP на Reactjs с помощью Express. У меня есть загрузчик изображений (фотографий), который создает множество изображений разных размеров. Эта функция последовательно вызывается много раз в одном запросе API. Поэтому я думаю, что будет неудобно вызывать следующую функцию из предыдущей.

Alexander Ladonin 22.05.2019 13:56

Добавлен пример кода для упомянутого асинхронного подхода к ожиданию @TKoL.

BraveButter 22.05.2019 14:19

Другие вопросы по теме