Не связывает асинхронные функции? - PullRequest
0 голосов
/ 20 февраля 2019

При попытке перекодировать старую систему для друга у меня возникли некоторые проблемы с асинхронными вызовами функций с помощью пакета узла Jimp : https://github.com/oliver-moran/jimp/tree/master/packages/jimp

Вот код I 'мы собрали вместе:

async format(file, config = {}) {

    try {

        return Jimp.read(file).then(image => {

             if (config.quality) {
                const quality = parseInt(config.quality.replace(/\D+/g, ''), 10);
                image.quality(quality);
            }

            if (config.brightness) {
                image.brightness(config.brightness);
            }

            return image.getBufferAsync(Jimp.MIME_JPEG);

        }).catch(error => {
            console.error(error);
        });

    } catch (err) {
        console.log(err);
        return false;
    }
}

let response = await this.format(file.Body, config);

Это минималистская версия того, что я собрал, но я не уверен, почему выходной буфер равен 0 КБ?Я думаю, это потому, что я не выполнил каждую функцию как Обещание ?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

правильно соедините вашу асинхронную функцию с таким ожиданием, как это

async format(file, config = {}) {

    try {

    const image = await Jimp.read(file);

    if (config.quality) {
                const quality = await parseInt(config.quality.replace(/\D+/g, ''), 10);
                await image.quality(quality);
        }

    if (config.brightness) {
                await image.brightness(config.brightness);
        }

    return await image.getBufferAsync(Jimp.MIME_JPEG);

    } catch (err) {
        console.log(err);
        return false;
    }
}

let response = await this.format(file.Body, config);
0 голосов
/ 20 февраля 2019

Вы пишете функцию async, но не используете await - что лишает смысла использование async для упрощения работы с Promises.

Попробуйте это:

async format( file, config = {} ) {

    let image = await Jimp.read( file );
    if( config.quality ) {
        const quality = parseInt(config.quality.replace(/\D+/g, ''), 10);
        image.quality(quality);
    }

    if( config.brightness ) {
        image.brightness(config.brightness);
    }

    let buffer = await image.getBufferAsync( Jimp.MIME_JPEG );
    return buffer;
}

Ключевые слова async и await в JavaScript ведут себя практически так же, как и их ключевые слова в C # (за исключением работы на Promise<T> вместо Task<T>).Ключевое слово await может использоваться только в функциях с модификатором async (это также означает, что все функции async обязательно также возвращают Promise<T>).

Итак, это:

async foo() { // returns Promise<T>

    let a = getA();

    let b = await getBAsync( a );

    let c = getC( b );

    let d = await getDAsync( c );
    return d;
}

Эквивалентно:

foo() { // returns Promise<T>

    let a = getA();

    let bPromise = getBAsync( a );
    return bPromise.then( b => {

        let c = getC( b );

        let dPromise = getDAsync( c );
        return dPromise.then( d => {

            return d;
        } );

    } );
}

Или (с использованием цепочки Promise):

foo() { // returns Promise<T>

    let a = getA();

    return getBAsync( a )
        .then( b => {

            let c = getC( b );
            return c;
        } )
        .then( c => {

             return getDAsync( c );
        } );;
}

Советы:

  • Вы должны использовать TypeScript дляНа мой взгляд, JavaScript, так как правильное использование Promise<T> сопряжено с трудностями, если вы полагаетесь на слабую типизацию JavaScript.
  • Если вы не можете использовать TypeScript, вы все равно можете использовать *.d.ts файлы в качестве ссылкитак что вы знаете, какие библиотечные функции вы используете return Promise<T> (асинхронные функции), а какие возвращают T (синхронные, "нормальные" функции)
  • Общепринятым соглашением о кодировании является добавление суффикса к имени функции с Async, если она возвращает Promise<T> в качестве любезности любым вашим потребителям библиотеки (хотя это не универсальнообщие, например, ESLint решил против этого:https://github.com/eslint/eslint/issues/8531)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...