Вы пишете функцию 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)