在尝试为朋友重新编码旧系统时,我在使用 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 功能?
答案 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中的async
和await
关键字的行为与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 );
} );;
}
提示:
Promise<T>
的正确使用会遇到很多困难。*.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);