不链接异步功能?

时间:2019-02-20 03:51:17

标签: node.js asynchronous promise

在尝试为朋友重新编码旧系统时,我在使用 Jimp 节点程序包https://github.com/oliver-moran/jimp/tree/master/packages/jimp

进行异步函数调用时遇到了一些问题

这是我编写的代码:

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

那是我放在一起的最低限度版本,但是我不确定为什么输出缓冲区为0kb?我在想这是因为我没有完成每个 Promise 功能?

2 个答案:

答案 0 :(得分:1)

您正在编写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;
}

JavaScript中的asyncawait关键字的行为与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,因为如果您依靠JavaScript的弱类型输入,Promise<T>的正确使用会遇到很多困难。
  • 如果您不能使用TypeScript,仍然可以使用*.d.ts文件作为参考,这样您就可以知道正在使用的库函数返回Promise<T>(异步函数)以及返回的{{1 }}(同步的“正常”功能)
  • 一个通用的编码约定是,如果出于对您的任何库使用者的礼貌返回d.ts,则在函数名后加上Async后缀(尽管这不是普遍的用法,例如ESLint决定反对: https://github.com/eslint/eslint/issues/8531

答案 1 :(得分:0)

像这样的等待正确地链接您的异步功能

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